今天在做项目的时候,按道理一个用户点击了注销,并在相关的servlet中清除了关于此用户的session。此重定向回了登录页面。并在过滤器中进行了设置。
//过滤器代码
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
User user =(User) req.getSession().getAttribute(Constants.USER_SESSION);
if(user == null) {
resp.sendRedirect(req.getContextPath()+"/index.jsp");
}else {
// pass the request along the filter chain
chain.doFilter(request, response);
}
}
设置完之后,在用户退出登录页面,在输入用户的主页地址,的确可以起到拦截的作用。但是,奇怪的是,当我们点击浏览器返回上一页的时候,竟然可以访问到该用户注销前的页面。这在现实生活中明显是不合法的。因此我刚开始会以为是过滤器失效了,但是在相关地方后进行输出参数的测试,发现相关的过滤器和servlet并未失效。这就说明了,浏览器的返回上一步,并不是真正的进行了网络请求服务,这就导致了并没有经过过滤器。
在网上搜查了一波才发现,浏览器是有缓存的呀。刚刚返回上一步之所以没有经过过滤器是因为读取的是缓存。竟然这样的话,我们就可以通过response.setHeader()的方法,给浏览器一个响应,不让浏览器缓存。
更改后过滤器的代码:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//禁止浏览器缓存
resp.setHeader("pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
resp.setHeader("Cache-Control", "no-store");
User user =(User) req.getSession().getAttribute(Constants.USER_SESSION);
if(user == null) {
resp.sendRedirect(req.getContextPath()+"/index.jsp");
}else {
// pass the request along the filter chain
chain.doFilter(request, response);
}
}