2011-11-28 220 views
2

我想在春天學習攔截器,但無法理解它。我嘗試了一個示例,但沒有成功。我創建了一個簡單的攔截器一樣春天的攔截器MVC

@Component("testInterceptor") 
public class testInterceptor extends HandlerInterceptorAdapter {  
    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ 
//I suppose this method will be called when I open my login page so just write something here  
     System.out.println("Inside Interceptor..."); 
     ModelAndView mv = new ModelAndView(); 
     mv.addObject("name", "test name"); 
     return true; 
} 

} 

在我爲spring-servlet.xml我

<context:component-scan base-package="com.test.interceptor" /> 
<mvc:interceptors> 
      <bean class="com.test.interceptors.testInterceptor " />   
</mvc:interceptors> 

在我的登錄頁面,我寫的某處$ {name}的

所以我甚至無法在任何地方看到$ {name}值或sysout。

我甚至無法理解postHandler或afterCompletion方法何時會被調用,以及如何在實現前測試它們。這可能是因爲我對春天也很陌生,而且我無法完全理解它。如果你建議閱讀一些好的鏈接來展示一些例子,那將是很大的幫助。

在此先感謝

編輯: 現在我可以看到我的系統輸出時的CommNet我打電話給我的登錄頁面,但它顯示它的16倍,爲什麼會這樣呢?

+0

現在我可以看到我的sysout commnet,當我打電話給我的登錄頁面,但它顯示了16次爲什麼這樣呢? – user965884

回答

11

首先看看界面HandlerInterceptor它有很好的記錄! (HandlerInterceptorAdapter只是一個可以幫助你的子類,如果你不想實現所有3種方法)。

然後您會注意到有3種方法,每種屬於「處理」鏈中的一個步驟。

然後您會注意到您使用了錯誤的方法:使用postHandle而不是preHandle

然後您會注意到您在過濾器ModelAndView mv = new ModelAndView();中創建的模型映射未連接到某個東西,因此它無法工作!幸好postHandle有一個ModelAndView modelAndView參數。而且您必須使用此代替創建未連接的模型映射。

稍後您可能會注意到您創建了兩次過濾器。一次通過組件掃描,一次通過xml聲明。 (在這種情況下,我會建議刪除@Compnent註釋)

所以最終你的類會是什麼樣子:

public class testInterceptor extends HandlerInterceptorAdapter {  
    @Override 
    public boolean postHandle(HttpServletRequest request, 
      HttpServletResponse response, 
      Object handler, 
      ModelAndView modelAndView){ 
     modelAndView.addObject("name", "test name"); 
    } 
} 

在最後你會發現(我不是100%確定),這攔截器不會針對彈簧安全登錄請求(j_spring_security_check)或註銷進行調用。因爲這是在調用任何HandlerInterceptor之前應用的Spring安全篩選器中處理的。


(評論),現在我可以看到我的系統輸出的評論時,我打電話給我的登錄頁面,但它顯示的是它的16倍,爲什麼會這樣呢?

也許是因爲你正在通過控制器加載一些資源(圖像,CSS,JS)。

+0

非常好的解釋拉爾夫..非常感謝 – user965884

1

爲什麼不嘗試將name屬性添加到請求中。

+0

對不起,肖恩我沒有得到你可以請你寫一行代碼 – user965884

+0

request.setAttribute(「name」,「test name」); – seanxiaoxiao