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" />
4

3 回答 3

1

首先修复您的注释。它应该至少包含一个@Retention元注释并使其在运行时可用,目前它不是,因此也会失败。

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

旁边确保您<mvc:annotation-driven />的配置中没有一个,因为这将使您明确配置的RequestMappingHandlerMapping无用。如果你正在使用<mvc:annotation-driven />,你应该使用<mvc:interceptors />标签来注册拦截器。

于 2013-11-01T10:02:15.120 回答
0

请在工作区的所有 XML 文件中搜索拦截器。

我通过意识到 servlet-context 文件已经存在于定义注释驱动和其他拦截器的位置来解决这个问题。将我的拦截器定义放在该文件中后,它就像一个魅力。

我花了相当多的 1.5 天挠头,事实证明 spring 不喜欢拦截器的多个位置。

于 2015-03-01T06:57:50.817 回答
0

检查这些文件:

  • resources/spring/spring.xml
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         ...
        <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml"/>
    </bean>
  • resources/mybatis/mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    ...
    <plugins>
        <!-- Interceptor configuration -->
        <plugin interceptor="com.w.pay.api.test.mvn.res.db.MybatisLogPrinter" />
    </plugins>
</configuration>
于 2020-11-09T09:08:40.547 回答