2013-11-01 39 views
0

我編寫了一個攔截器,如下所示:春天攔截器無法正常工作

package org.mybatis.jpetstore.interceptor; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.mybatis.jpetstore.annotation.CsrfTokenCheck; 
import org.mybatis.jpetstore.tool.CsrfTokenTool; 
import org.springframework.web.method.HandlerMethod; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

public class CsrfTokenAnnotationInterceptor extends HandlerInterceptorAdapter { 
    @Override 
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { 
    } 

    @Override 
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object ojbect) throws Exception { 
     System.out.println("======================"); 
     //if(ojbect instanceof HandlerMethod){ 
      CsrfTokenCheck csrfTokenCheck = ((HandlerMethod) ojbect).getMethodAnnotation(CsrfTokenCheck.class); 

      System.out.println("++++++++++++++++++++++"); 
      if(csrfTokenCheck != null && !new CsrfTokenTool().verify((HttpServletRequest) request)){ 
       response.sendRedirect("http://www.google.com"); 
       return false; 
      } 
     //} 

     return true; 
    } 
} 

但似乎不工作(代碼取決於spring3.2)

註釋中的控制器:

@CsrfTokenCheck 
    public ModelAndView list(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     ModelAndView mav = new ModelAndView("category/category"); 

     return mav; 
    } 

接口:

package org.mybatis.jpetstore.annotation; 

public @interface CsrfTokenCheck{ 
} 

我還在我的spring-config.xml中配置瞭如下內容:

<bean id="requestMappingHandlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <ref bean="csrfTokenAnnotationInterceptor" /> 
     </list> 
    </property> 
</bean> 

<bean id="csrfTokenAnnotationInterceptor" class="org.mybatis.jpetstore.interceptor.CsrfTokenAnnotationInterceptor" /> 
+0

xml的第一行是:,我不知道這邊有什麼問題...如果我輸入「」,它會消失。 – eingmarra

回答

1

從修改註釋開始。它至少應包含一個@Retention元註釋並在運行時使其可用,目前它不是,因此也會失敗。

@Target({ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CsrfTokenCheck{} 

下一步是確保你沒有一個<mvc:annotation-driven />在配置爲會使您明確配置RequestMappingHandlerMapping沒用。如果您使用的是<mvc:annotation-driven />,則應使用<mvc:interceptors />標籤註冊攔截器。

0

請在工作區的所有XML文件中搜索攔截器。

我解決了這個問題,意識到servlet-context文件已經存在,其中定義了註解驅動和其他攔截器。在將我的攔截器定義放置在該文件中後,它就像一個魅力一樣。

我花了1.5天的時間搔了搔腦袋,結果發現春天不喜歡多個位置的攔截器。