Как правильно аннулировать сеанс JSP?

Итак, вот в чем проблема. Когда пользователь выходит из моего веб-сайта, он все равно может нажать кнопку «Назад» и продолжить использование сайта. Чтобы отслеживать, вошел ли пользователь в систему или нет, я создал атрибут сеанса isActive. Атрибуту присваивается значение true, когда пользователь входит в систему, и он (избыточно) удаляется прямо перед тем, как сеанс становится недействительным при выходе из системы. Также на каждой странице я проверяю, присутствует ли атрибут.

Я также указываю, что страницы не должны кэшироваться в их тегах заголовка.

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

Есть идеи, как это исправить?

Вот код:

Сервлет входа:

...
session.setAttribute("isActive", true);
//Redirect to home page.

Проверить JSP с входом в систему:

<c:if test='${empty sessionScope.isActive || sessionScope.isActive != true}'>
     <c:redirect url="/index.jsp?message=Session Timed Out."/>
</c:if>

Сервлет выхода:

request.getSession().removeAttribute("isActive");
request.getSession().invalidate();
response.sendRedirect("index.jsp");

Тег Inside Head:

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">

Спасибо


person Morglor    schedule 10.10.2010    source источник


Ответы (3)


Мета-тегов недостаточно. Вам нужно добавить их как полноценные заголовки ответов. Веб-браузер полагается на них. В этом поможет Filter. Кроме того, заголовок Cache-Control является неполным (помимо прочего, он не будет работать должным образом в Firefox).

Реализуйте это в doFilter() методе Filter, который отображается на url-pattern, например, *.jsp (если вы хотите охватить все страницы JSP).

HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);

Таким образом, веб-браузер будет вынужден отправить настоящий запрос на сервер, а не отображать страницу из кеша браузера. Кроме того, вам лучше использовать Filter для проверки присутствия вошедшего в систему пользователя, а не JSP / JSTL.

Связанные вопросы:

person BalusC    schedule 10.10.2010
comment
Пожалуйста. Не забудьте отметить как принятый наиболее полезный ответ. См. Также stackoverflow.com/faq. - person BalusC; 15.10.2010

Не следует проверять, активен ли еще сеанс на целевой странице, лучше проверить это с помощью Filter.

Если в фильтре request.getSession().getAttribute("isActive") что-то возвращает, значит, пользователь все еще вошел в систему, и вы просто выполняете цепочку; иначе вы перенаправляете на страницу входа.

Например :

public class ActiveFilter implements Filter {
   public void init(FilterConfig filterConfig) 
   }
   public void destroy() {
   }
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;
      if (req.getSession().getAttribute("isActive") == null){
          res.sendRedirect("/index.jsp");
      }else{
          chain.doFilter(request, response);
      }
   }
}

Ресурсы:

person Colin Hebert    schedule 10.10.2010
comment
Спасибо, вы знаете, как заставить это работать на каждой странице, кроме index.jsp? Не похоже, что тег url-pattern в web.xml поддерживает регулярные выражения. - person Morglor; 15.10.2010

Все мои JSP не имеют заголовков без кеширования (через директивы @include). У меня есть logout.jsp в корне приложения со следующими строками:

HttpSession sessIfAny = request.getSession(false);
if (sessIfAny != null) sessIfAny.invalidate();

Это предотвращает создание ненужных сеансов.

Файл web.xml должен освободить logout.jsp от аутентификации:

<!-- Resources excepted from authentication -->
<security-constraint>
    <web-resource-collection>
        <web-resource-name>excepted</web-resource-name>
        <url-pattern>/logout.jsp</url-pattern>
        <url-pattern>/favicon.ico</url-pattern>
        <!-- ... other resources -->
    </web-resource-collection>
    <!-- no auth-constraint -->
</security-constraint>

Это предотвращает отображение страницы входа в систему для выхода из сеанса с истекшим сроком действия.

person Peter L    schedule 15.07.2014