如何正确使JSP会话无效?

时间:2010-10-10 23:45:20

标签: java security jsp session invalidation

所以这就是问题所在。当用户退出我的网站时,他们仍然可以点击后退按钮并继续使用该网站。为了跟踪用户是否登录,我创建了一个会话属性“isActive”。用户登录时该属性设置为true,并且在注销时会话无效之前(冗余)删除该属性。同样在每个页面上,我都会检查属性是否存在。

我还指定不应在其头标记中缓存页面。

尽管这些用户仍然能够回访浏览器,并继续使用该网站,就好像他们从未注销过一样。

有关如何解决这个问题的想法吗?

以下是代码:

登录Servlet:

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

退出Servlet:

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 个答案:

答案 0 :(得分:11)

元标记不够用。您需要将它们添加为完整的响应标头。 webbrowser依赖于它们。 Filter对此有帮助。此外,Cache-Control标头不完整(在Firefox等中无法正常工作)。

doFilter()的{​​{1}}方法中实现此方法,该方法映射在例如Filter的{​​{1}}上(如果要覆盖所有JSP页面)。< / p>

url-pattern

这样,webbrowser将被强制在服务器上发出实际请求,而不是从浏览器缓存中显示该页面。此外,您应该使用*.jsp来检查登录用户的存在,而不是JSP / JSTL。

相关问题:

答案 1 :(得分:2)

您不应该检查目标页面上的会话是否仍处于活动状态,最好使用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);
      }
   }
}

资源:

答案 2 :(得分:0)

我的所有JSP都有no-cache标头(通过@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>

这可以防止显示登录页面在过期的会话中注销。