9

所以这就是问题所在。当用户退出我的网站时,他们仍然可以点击后退按钮并继续使用该网站。为了跟踪用户是否登录,我创建了一个会话属性“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>

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

谢谢

4

3 回答 3

11

元标记是不够的。您需要将它们添加为完全有价值的响应标头。网络浏览器依赖于它们。AFilter在这方面很有帮助。此外,Cache-Control标头不完整(在 Firefox 等中无法按预期工作)。

例如,在映射到 an的doFilter()方法中实现这一点(如果您想覆盖所有 JSP 页面)。Filterurl-pattern*.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);

这样,网络浏览器将被迫在服务器上触发一个真正的请求,而不是显示来自浏览器缓存的页面。此外,您应该使用 aFilter检查登录用户的存在,而不是 JSP/JSTL。

相关问题:

于 2010-10-10T23:51:43.603 回答
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);
      }
   }
}

资源 :

于 2010-10-10T23:47:51.900 回答
0

我所有的 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>

这可以防止显示登录页面以对过期会话进行注销。

于 2014-07-15T02:33:11.037 回答