如何避免静态资源请求被路由到拦截器?

时间:2015-07-02 04:07:43

标签: java spring spring-mvc model-view-controller

我使用最新的Spring(4.1.1)和tomcat 7.0.52。我启用了注释驱动的mvc。

在我的应用程序中,我定义了一个拦截器:

<mvc:interceptors>
    <bean class="com.abc.UserAgentChangeInterceptor"/>
</mvc:interceptors>

与此同时,我定义了资源:

<mvc:resources mapping="/static/**/*" location="/desktop"/>
<mvc:resources mapping="/**/*.css" location="/"/>
<mvc:resources mapping="/**/*.js" location="/"/>
<mvc:resources mapping="/**/*.gif" location="/"/>
<mvc:resources mapping="/**/*.htm" location="/"/>
<mvc:resources mapping="/**/*.svg" location="/"/>
<mvc:resources mapping="/**/*.png" location="/"/>

然而,当请求进入时,即使对于静态资源/资产,它们仍然首先被路由到拦截器。

我知道以下可以解决问题的做法:

  1. mvc:exclude-mapping内使用mvc:interceptor排除上述网址发送到我的拦截器的请求,但它似乎违反了DRY原则,我真的不喜欢喜欢外观和感觉。

  2. 在拦截器上使用mvc:mapping。但是,我在许多处理程序上使用注释驱动@RequestMapping,并且有许多不同的路径。这个解决方案对我来说也不干净。

  3. 我也发现意见说使用@ControllerAdvice代替拦截器可以帮助缓解问题,但根据我通过阅读Spring文档所学到的知识,@ControllerAdvice没有在preHandle()之前执行的与@Controller类似的任何方法

    我仍然更喜欢使用Spring XML配置方法解决此问题,而不是在我的应用程序中定义@Configuration类。只是一个惯例。

    任何意见都深表赞赏!

2 个答案:

答案 0 :(得分:0)

方法-1:在拦截器配置中使用映射路径

<mvc:interceptors>
    <mvc:interceptor>
      <mvc:mapping path="/path" />
          <bean
             class="bean" />
     </mvc:interceptor>
</mvc:interceptors>

方法-2:与mvc:资源一起,指定

<mvc:annotation-driven/>

答案 1 :(得分:0)

我发现当前的“解决方案”是使用方面。例如,如果我只想拦截@RequestMapping@Controller方法的请求。我会做的

@Aspect
@Order(1)
@Component
public class UserAgentChangeAspect {

    @Pointcut("execution(public * *(..)) && @within(org.springframework.stereotype.Controller) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")
    private void pointcut() {
    }

    @Before("pointcut()")
    public void preHandle()
            throws Exception {
        // logic
        }
    }

    @After("pointcut()")
    public void postHandle()
            throws Exception {
        // logic
    }
}

我会将此标记为已接受。如果有人有更好的想法,请发布它,如果我认为合适,我会接受它。