我使用最新的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="/"/>
然而,当请求进入时,即使对于静态资源/资产,它们仍然首先被路由到拦截器。
我知道以下可以解决问题的做法:
在mvc:exclude-mapping
内使用mvc:interceptor
排除上述网址发送到我的拦截器的请求,但它似乎违反了DRY原则,我真的不喜欢喜欢外观和感觉。
在拦截器上使用mvc:mapping
。但是,我在许多处理程序上使用注释驱动@RequestMapping
,并且有许多不同的路径。这个解决方案对我来说也不干净。
我也发现意见说使用@ControllerAdvice
代替拦截器可以帮助缓解问题,但根据我通过阅读Spring文档所学到的知识,@ControllerAdvice
没有在preHandle()
之前执行的与@Controller
类似的任何方法
我仍然更喜欢使用Spring XML配置方法解决此问题,而不是在我的应用程序中定义@Configuration
类。只是一个惯例。
任何意见都深表赞赏!
答案 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
}
}
我会将此标记为已接受。如果有人有更好的想法,请发布它,如果我认为合适,我会接受它。