2014-10-17 50 views
0

當用戶登錄時會話信息被存儲。 當用戶登錄 時會話信息被刪除。但是當我點擊瀏覽器的後退按鈕時,顯示用戶信息。由於會話已結束,但我們無法確定 是否執行了用戶登錄操作。我該如何解決這個 問題?如何在春天處理瀏覽器後退按鈕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"); 
    } 

回答

3

我用這個方法。 首先創建一個實現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-name>noCacheFilter</filter-name> 
    <filter-class>com.example.NoCacheFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>noCacheFilter</filter-name> 
    <url-pattern>/secured/*.jsp</url-pattern>// urls that not cached 
</filter-mapping> 
0
response.setHeader(refererUrl, "no-cache"); 
response.setHeader("Cache-Control", "no-cache"); 
response.setDateHeader("Expires", 0); 

上面的代碼清除高速緩存,至在服務器端的會話。但是無論會話是否存在,都應該在視圖中進行驗證或處理(HTML或JSP)。你可以有以下meta標籤在你看來說無緩存,無店鋪

<meta http-equiv="Cache-control" content="no-cache"> 

<META HTTP-EQUIV="Cache-Control" CONTENT="No-Cache,Must-Revalidate,No-Store"> 

請參考this的瀏覽器緩存控制

+0

我在我的查看頁面添加了這個標籤。 \t \t \t 2014-10-17 08:45:54

+0

工作正常嗎? – Sridhar 2014-10-17 09:27:39

1

配置Servlet上下文內的攔截器,因爲這:

<!-- configuration for handling browser back button --> 
<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/**/*"/> 
     <beans:bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
      <beans:property name="cacheSeconds" value="0"/> 
      <beans:property name="useExpiresHeader" value="true"/> 
      <beans:property name="useCacheControlHeader" value="true"/> 
      <beans:property name="useCacheControlNoStore" value="true"/> 
     </beans:bean> 
    </mvc:interceptor> 
</mvc:interceptors> 

注意:不要忘記刪除您瀏覽器的緩存,同時測試您的應用程序。

1

在spring-security 4.0中,這個問題已經默認解決了。即使在安全性XML配置中,您也不需要編寫任何附加代碼。

+0

很久以前我問這個問題。但謝謝你的回答。 – 2016-06-26 10:16:39