解决用户注销后,依然可以在注销前页面的问题(javaweb)

今天在做项目的时候,按道理一个用户点击了注销,并在相关的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);
		}
		
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章