2012-01-05 83 views
3

我有一個要求來完成。如何在Spring MVC控制器中添加Precall方法

實際上,當有用戶登錄到我的應用程序時,我會將登錄的用戶名保存在會話屬性中。

session.setAttribute("LOGIN_USER", userName); 

因此,如果用戶試圖直接訪問我的方法的聯繫與出從登錄頁面來我可以在控制器的方法檢查該會話是否具有如下特定的屬性值,我可以限制用戶訪問該頁面並將他重定向到登錄頁面。

if(request.getSession(false).getAttribute("LOGIN_USER")==null) 
//redirect to login page 

現在,我的要求是,如果我有50種方法,控制器我不能在每個添加此條件method.I認爲這是我們可以添加某種過濾器或控制器類像任何方法方式ex @ preExecuteMethod首先執行此方法並在成功時繼續進行實際調用。

回答

3

是的,你可以使用HandlerInterceptor這個。請參閱文檔herehere

+2

我怎樣才能用這個基於註解控制器? – Ran 2012-01-05 08:44:31

+0

@Rana:通過閱讀我剛剛鏈接的文檔,然後給它一個。如果您無法正常工作,請向我們提出另一個問題,告訴我們您嘗試了什麼。 – skaffman 2012-01-05 09:23:18

0

也許你可以使用AOP @Before方法給切入點類中的方法提供切入點?請參閱參考here或者您可以通過delegatingFilterProxy創建一個正常的過濾器解釋here。我認爲整體@skaffman提供了一個更好的主意。

1

攔截器是解決方案。它有方法preHandler將在每個請求之前調用。您可以掛鉤到每個HTTPServletRequest對象並執行必要的操作。

這裏是一個示例代碼:

@Component 
public class AuthCodeInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception { 

     // set few parameters to handle ajax request from different host 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); 
     response.addHeader("Access-Control-Max-Age", "1000"); 
     response.addHeader("Access-Control-Allow-Headers", "Content-Type"); 
     response.addHeader("Cache-Control", "private"); 

     String reqUri = request.getRequestURI(); 
     String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1, 
       reqUri.length()); 
     if(request.getSession(false).getAttribute("LOGIN_USER")==null) { 
      //redirect to login page 
     } 
     return super.preHandle(request, response, handler); 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 

     super.postHandle(request, response, handler, modelAndView); 
    } 
} 
+1

儘管它的構造,'preHandle'似乎永遠不會被調用,至少不使用'MockMvc'時。 – OrangeDog 2016-06-27 15:59:46