Получение sessionId без доступа к сеансу с помощью API cookie - PullRequest
0 голосов
/ 24 января 2012

Мне нужно получить идентификатор текущей сессии, не обращаясь к сессии (чтобы дать ей возможность истечь).

Я использовал файлы cookie из кода сервлета для того, чтобы сохранить сеанс без изменений, а затем сделать истечение времени сеанса по истечении времени ожидания.

Я использую следующий код:

public static String getSessionId(HttpServletRequest request)
{
    String sessionId = "";
    String logMsg = "";
    if (request != null)
    {
        String sessionTimeout = PropertiesReader.SESSION_TIMEOUT_SCHEMA;
        if (sessionTimeout != null && SessionHelper.SESSION_TIMEOUT_FIXED.equalsIgnoreCase(sessionTimeout))
        {
            logMsg = "FIXED: Getting SessionId from Cookies with activating the session";
            Cookie[] cookies = request.getCookies();
            if (cookies != null)
            {
                for (Cookie cook : cookies)
                {
                    if ("JSESSIONID".equalsIgnoreCase(cook.getName()))
                    {
                        sessionId = cook.getValue();
                        break;
                    }
                }
            }
        } else
        {
            logMsg = "PER_USAGE: Getting SessionId from Session";
            sessionId = request.getSession(false) != null ? request.getSession(false).getId() : "";
        }
    }else
    {
        logMsg = "Request object is null";
    }

    logger.info(logMsg + ", sessionId=" + sessionId);

    return sessionId;
}

Один сервер приложений OC4J, он отлично работает. хотя на другом сервере oc4j код доступа к файлам cookie позволяет сеансу оставаться активным и не прерывать работу!

EDIT :

Я действительно застрял! Я пытаюсь установить фильтр для удаления файла cookie JSESSIONID и удаления всех файлов cookie из запроса HttpServletRequest, но когда я вызываю getSession (false) для запроса, переданного сервлету, я получаю действительный сеанс!

class CookieRemovalHttpServletRequestWrapper extends HttpServletRequestWrapper
    {
        public static final String COOKIE_HEADER = "cookie";
        public static final String JSESSIONID = "JSESSIONID";

        public CookieRemovalHttpServletRequestWrapper(HttpServletRequest request)
        {
            super(request);
        }

        @Override
        public String getHeader(String name)
        {
            if (COOKIE_HEADER.equalsIgnoreCase(name))
            {
                return "";
            }
            return super.getHeader(name);
        }

        @Override
        public Enumeration getHeaderNames()
        {
            Enumeration e = super.getHeaderNames();
            List l = new ArrayList();
            while (e.hasMoreElements())
            {
                String headerName = (String) e.nextElement();
                if (!COOKIE_HEADER.equalsIgnoreCase(headerName))
                {
                    l.add(headerName);
                }
            }

            return Collections.enumeration(l);
        }

        @Override
        public Enumeration getHeaders(String name)
        {
            if (COOKIE_HEADER.equalsIgnoreCase(name))
            {
                return new Enumeration()
                {
                    public boolean hasMoreElements()
                    {
                        return false;
                    }

                    public Object nextElement()
                    {
                        return null;
                    }
                };
            }
            return super.getHeaders(name);
        }

        @Override
        public Cookie[] getCookies()
        {
            Cookie[] cs = super.getCookies();
            List<Cookie> cokRet = new ArrayList<Cookie>(cs.length);
            for (Cookie c : cs)
            {
                if (c.getName().equalsIgnoreCase(JSESSIONID)) continue;
                cokRet.add(c);
            }

            return cokRet.toArray(new Cookie[] {});
        }

    }

И действительно подумайте, чтобы забыть все о сеансе и просто использовать идентификатор сеанса в качестве просто уникального идентификатора для пользователя, и сделать это самому нелегко.

Ответы [ 3 ]

5 голосов
/ 24 января 2012

Что касается вашего кода, не делайте его сложным образом, используйте HttpServletRequest#getRequestedSessionId() и HttpServletRequest#isRequestedSessionIdValid() вместо того, чтобы проверить запрошенный идентификатор сеанса и, если он действителен.

if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
    // The session has been expired (or a hacker supplied a fake cookie).
}

Что касается вашей конкретной проблемы:

код доступа к файлам cookie позволяет сеансу оставаться активным и без тайм-аута!

Нет, код этого не делает.Это сам запрос HTTP, который делает это.Это неправда, что всякий раз, когда вы не звоните getSession() или что-то еще, тайм-аут сеанса не будет отложен.Он будет отложен на каждый отдельный HTTP-запрос, инициированный клиентом, независимо от того, нужен ли вам сеанс в коде.

Чтобы узнать о том, как работают сеансы, вам может пригодиться этот ответ: Как сделатьсервлеты работают?Создание экземпляров, сеансы, общие переменные и многопоточность

1 голос
/ 24 января 2012

Срок истечения сеанса не зависит от вашего кода , обращающегося к сеансу, это зависит от того, пользователь отправляет запрос с этим сеансом.Каждый раз, когда пользователь отправляет запрос, время ожидания сеанса сбрасывается само.

Если вы хотите, чтобы не , запрос пользователя переустанавливал время ожидания (т. Е. Проводите сеанс фиксированной длины).), то вам потребуется выполнить дополнительные действия для настройки сеанса, включая, возможно, использование другого фильтра для обработки сеансов.

0 голосов
/ 24 января 2012

Сеанс не является тайм-аутом, это правильное поведение, потому что запрос был принят, и срок действия сеанса обновляется в любом случае.

...