首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring拦截器不工作

Spring拦截器不工作
EN

Stack Overflow用户
提问于 2013-11-01 14:26:54
回答 3查看 1.6K关注 0票数 0

我编写了一个拦截器,如下所示:

代码语言:javascript
复制
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)

控制器中的注释:

代码语言:javascript
复制
@CsrfTokenCheck
    public ModelAndView list(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("category/category");

        return mav;
    }

接口:

代码语言:javascript
复制
package org.mybatis.jpetstore.annotation;

public @interface CsrfTokenCheck{
}

我还在spring-config.xml中进行了如下配置:

代码语言:javascript
复制
<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" />
EN

回答 3

Stack Overflow用户

发布于 2013-11-01 18:02:15

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

代码语言:javascript
复制
@Target({ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CsrfTokenCheck{}

其次,确保您的配置中没有<mvc:annotation-driven />,因为这将使您显式配置的RequestMappingHandlerMapping变得无用。如果你正在使用<mvc:annotation-driven />,你应该使用<mvc:interceptors />标签来注册拦截器。

票数 1
EN

Stack Overflow用户

发布于 2015-03-01 14:57:51

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

我意识到servlet上下文文件已经存在,并在其中定义了注释驱动和其他拦截器,从而解决了这个问题。将我的拦截器定义放入该文件后,它就像一个护身符一样工作。

我花了整整1.5天的时间挠头,结果发现spring不喜欢拦截器的多个位置。

票数 0
EN

Stack Overflow用户

发布于 2020-11-09 17:08:41

检查这些文件:

  • resources/spring/spring.xml

代码语言:javascript
复制
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         ...
        <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml"/>
    </bean>

  • resources/mybatis/mybatis-config.xml

代码语言:javascript
复制
<?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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19721867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档