【问题标题】:Spring MVC 3, Interceptor on all excluding some defined pathsSpring MVC 3,所有不包括某些已定义路径的拦截器
【发布时间】:2017-05-11 01:27:33
【问题描述】:

是否可以将拦截器应用于所有控制器和操作,除了一些已定义的控制器和操作?

为了清楚起见,我对在已定义的列表上应用拦截器不感兴趣。我想定义那些要排除的。

谢谢!

【问题讨论】:

    标签: spring-mvc interceptor


    【解决方案1】:

    从 Spring 3.2 开始,他们使用标签添加了该功能

    mvc:exclude-mapping
    

    请参阅 Spring 文档中的此示例:

    <mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor" />
    </mvc:interceptor>
    

    这是文档的link

    【解决方案2】:

    对于基于 java 的配置,来自docs

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LocaleInterceptor());
            registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
            registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
        }
    
    }
    

    【讨论】:

    • XML 等效项显示为:... &lt;bean class="org.example.SecurityInterceptor"/&gt; ... - 只是为了让其他人知道 SecurityInterceptor 不是 springframework 类。
    【解决方案3】:

    配置拦截器时,可以指定路径模式。只有路径与拦截器路径模式匹配的控制器才会调用拦截器。

    参考:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config-interceptor

    但您可能已经注意到,路径模式不支持排除。

    所以我认为唯一的方法是在拦截器内编写一个路径黑名单。调用拦截器时,检索HttpServletRequest.getRequestURI() 并检查路径是否被列入黑名单。

    您可以在拦截器的 @PostConstruct 注释方法中构建黑名单,例如从属性文件中获取黑名单路径。

    【讨论】:

    • 是的,问题是确定控制器和动作的正确方法是什么,因为理论上可以以各种方式建立控制器映射...... spring 知道控制器将被触发拦截器,因为处理程序对象是控制器实例。为了正确地做到这一点,必须使用与弹簧相同的机制来确定目标动作......任何一个? :)
    • Spring用来确定正确控制器的机制依赖于@RequestMapping注解。所以对拦截器有同样的东西意味着基本上用@RequestMapping注释一个拦截器。但这目前是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多