Spring MVC 拦截器模式
Spring MVC Interceptor pattern
我有一个拦截器应该拦截具有不同模式的 url,例如:
- myapp/something/add/whatever
- myapp/something/add
- myapp/something/add随便
- myapp/something/somethingelse/add
- 等...
我必须拦截所有包含 "add" 的网址。有很多 somethings 和 somethingelses...
我尝试了不同的模式,但似乎都是错误的:
- **/添加/*
- **/添加*
- **/add/ **(我在最后一个 ** 前加了一个空格 space 所以它不会格式化为粗体)
拦截器类似于
public class MyInterceptor implements HandlerInterceptor {
}
我配置在
@Configuration
@EnableSpringDataWebSupport
@EnableWebMvc
class MvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor()).addPathPatterns("**/add/*", "**/add/**", "**/add*");
}
@Bean
public MyInterceptor getMyInterceptor() {
return new MyInterceptor();
}
}
如果我尝试访问
http://localhost:8080/myapp/something/add/somethingelse
我的拦截器没有拦截它...
显然这可以通过将 bean 类型更改为 "Mapped Interceptor" 并包装它来解决;尽管人们似乎并不知道为什么它首先是一个问题。
基于此解决方案:
我遇到了类似的问题。这是我的建议。
首先使用全局拦截器并检查请求uri:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if(uri.contains("/add")){
// do your job
}
return super.preHandle(request, response, handler);
}
}
在我的例子中,所有 add
- 方法都是 PUT
或 POST
请求。所以我在我的全局拦截器中检查这个:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String method = request.getMethod();
if("PUT".equals(method) || "POST".equals(method)){
// do your job
}
return super.preHandle(request, response, handler);
}
}
不配置 addPathPatterns
:
@Configuration
@EnableSpringDataWebSupport
@EnableWebMvc
class MvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor());
}
@Bean
public MyInterceptor getMyInterceptor() {
return new MyInterceptor();
}
}
我有一个拦截器应该拦截具有不同模式的 url,例如:
- myapp/something/add/whatever
- myapp/something/add
- myapp/something/add随便
- myapp/something/somethingelse/add
- 等...
我必须拦截所有包含 "add" 的网址。有很多 somethings 和 somethingelses...
我尝试了不同的模式,但似乎都是错误的:
- **/添加/*
- **/添加*
- **/add/ **(我在最后一个 ** 前加了一个空格 space 所以它不会格式化为粗体)
拦截器类似于
public class MyInterceptor implements HandlerInterceptor {
}
我配置在
@Configuration
@EnableSpringDataWebSupport
@EnableWebMvc
class MvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor()).addPathPatterns("**/add/*", "**/add/**", "**/add*");
}
@Bean
public MyInterceptor getMyInterceptor() {
return new MyInterceptor();
}
}
如果我尝试访问
http://localhost:8080/myapp/something/add/somethingelse
我的拦截器没有拦截它...
显然这可以通过将 bean 类型更改为 "Mapped Interceptor" 并包装它来解决;尽管人们似乎并不知道为什么它首先是一个问题。
基于此解决方案:
我遇到了类似的问题。这是我的建议。
首先使用全局拦截器并检查请求uri:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if(uri.contains("/add")){
// do your job
}
return super.preHandle(request, response, handler);
}
}
在我的例子中,所有 add
- 方法都是 PUT
或 POST
请求。所以我在我的全局拦截器中检查这个:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String method = request.getMethod();
if("PUT".equals(method) || "POST".equals(method)){
// do your job
}
return super.preHandle(request, response, handler);
}
}
不配置 addPathPatterns
:
@Configuration
@EnableSpringDataWebSupport
@EnableWebMvc
class MvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor());
}
@Bean
public MyInterceptor getMyInterceptor() {
return new MyInterceptor();
}
}