Как сохранить атрибут сеанса - PullRequest
0 голосов
/ 29 декабря 2010

У меня есть html-страница поиска, которая работает вместе с классом Java HttpServlet, который обрабатывает некоторые функции и отправляет результаты на страницу jsp.

Чтобы выполнить поиск, мне нужен объект loginresult, который я поместил в сеанс в другой сервлет.

Вот что происходит в сервлете входа в систему:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        // get attributes that were filled in on the login webpage
        request.getAttribute("username");
        request.getAttribute("password");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        LoginManager loginManager = new LoginManager(username.trim(), password.trim());
        if (loginManager.doLogin() == true) {
            javax.servlet.http.HttpSession session = request.getSession();
            session.setAttribute("loginResult", loginManager.getLoginResult());
            session.setAttribute("binding", loginManager.getBinding());
            response.sendRedirect("lookup.html");

Это то, что происходит с сервлетом поиска

request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html");
            javax.servlet.http.HttpSession session = request.getSession();
            LoginResult lr = (LoginResult) session.getAttribute("loginResult");
            if(lr == null)
            {
                throw new Exception("Your session has expired, please log in again");
            }

            // some look up code

            RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp");
            request.setAttribute("result", result);
            request.setAttribute("question", question);
            request.setAttribute("xml", xml);
            dispatcher.forward(request, response);

На моей странице jsp есть кнопка ввода, которая выполняет следующие действия: ONCLICK = "window.location.href = 'lookup.html'" />

Иногда, когда я оставляю свою страницу результатов несфокусированной или минимизирую или что-то еще, или я жду слишком долго и нажимаю кнопку возврата на страницу поиска, появляется, что мой объект loginresult == нуль Так что, на мой взгляд, это швы, чтобы быть истекшим. Хотя я думал, что сервер Apache Tomcat поддерживает стандартные сеансы в течение 30 минут.

Есть предположения, почему мой атрибут сеанса исчез?

1 Ответ

1 голос
/ 30 декабря 2010

Сначала вы должны определить, действительно ли вы получаете тот же сеанс или нет. Есть 2 простых способа сделать это.

1.) Просмотрите содержимое файла cookie JSESSIONID. Большинство браузеров делают это тривиальным. Если содержимое изменилось, вы получили другой сеанс.

2.) Вы можете попробовать подключить HttpSessionListener для регистрации, когда ваши сеансы уничтожаются.

Если вы получаете новый сеанс, вы должны сузить его до проблемы конфигурации (Tomcat, web.xml, фрагмента контекста и т. Д.) Или проблемы приложения. Если это проблема конфигурации, проблема должна повторяться на других страницах, кроме тех, которые вы упомянули.

Также рассмотрите возможность использования getSession (false), который не создаст новый сеанс, если он еще не существует. Если вы получаете нулевое значение от этого, это еще один показатель того, что ваши сеансы истекают.

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

...