所以这就是问题所在。当用户退出我的网站时,他们仍然可以点击后退按钮并继续使用该网站。为了跟踪用户是否登录,我创建了一个会话属性“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">
由于
答案 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>
这可以防止显示登录页面在过期的会话中注销。