Как правильно сделать недействительным сеанс JSP? - PullRequest
9 голосов
/ 11 октября 2010

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

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

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

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

Вот код:

Сервлет входа в систему:

...
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");

Внутренняя метка:

<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">

Спасибо

Ответы [ 3 ]

11 голосов
/ 11 октября 2010

Метатеги недостаточно.Вы должны добавить их как полноценные заголовки ответа.Веб-браузер полагается на них.A 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.

Вопросы, связанные с данной:

2 голосов
/ 11 октября 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);
      }
   }
}

Ресурсы:

0 голосов
/ 15 июля 2014

Все мои 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>

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

...