如何在spring mvc中处理浏览器后退按钮

当用户登录时会存储会话信息。 并且当用户注销时会删除会话信息。 但是当我点击浏览器的后退按钮时,会显示用户信息。 由于会话已经消失,但我们无法确定是否执行了用户登录操作。 我该如何解决这个问题?

----------------------------log out ------------------------------- @RequestMapping(value="logout.htm",method = RequestMethod.GET) public void logOut(HttpSession session,HttpServletResponse response,HttpServletRequest request) throws IOException{ final String refererUrl = request.getHeader("Referer"); response.setHeader(refererUrl, "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); session.removeAttribute("user"); session.invalidate(); response.sendRedirect("index.htm"); } ---------------------------------- login --------------- @RequestMapping(value="/userLogin",method=RequestMethod.POST) public @ResponseBody JsonResponse login(@ModelAttribute(value="user") User user, BindingResult result,HttpServletRequest request,HttpSession session,ModelMap model) throws UnsupportedEncodingException{ JsonResponse res = new JsonResponse(); if(!result.hasErrors()&& userService.findUser(user, request)){ res.setStatus("SUCCESS"); session.setAttribute("user", new String(user.getUsername().getBytes("iso- 8859-1"), "UTF-8")); } else{ res.setStatus("FAIL"); result.rejectValue("username","1"); res.setResult(result.getAllErrors()); } return res; } --------------------------profile -------------------------------------- @RequestMapping(value="myProfile.htm",method = RequestMethod.GET) public String showmyProfile(@ModelAttribute(value="addUser") User user,Model model,HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException{ if(session.getAttribute("user")== null){ response.sendRedirect("index"); } 

我用这种方法。 首先创建一个实现Filter的类并重写doFilter()方法。 doFilter()的代码是:

  @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse hsr = (HttpServletResponse) res; hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0. hsr.setDateHeader("Expires", 0); // Proxies. chain.doFilter(req, res); } 

在web.xml中使用filter之后。 这个filter就是这个。

   noCacheFilter com.example.NoCacheFilter   noCacheFilter /secured/*.jsp// urls that not cached  

在Servlet Context中配置一个拦截器,如下所示:

             

注意:在测试应用程序时,请不要忘记删除浏览器缓存。

在spring-security 4.0中,此问题已默认解决。即使在安全XML配置中,您也无需编写任何其他代码。

 response.setHeader(refererUrl, "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); 

上面的代码清除缓存并使服务器端的会话到期。 但是,无论会话是否有效,都应该在您的视图中validation或处理(HTML或JSP)。 您可以在视图中使用以下元标记来表示no-cache和no-store

  

要么

  

请参阅此浏览器缓存控制