springboot中 RequestInterceptor 和 Ordered 哪个拦截先执行
时间: 2024-06-04 07:08:11 浏览: 7
在Spring Boot中,`RequestInterceptor`和`Ordered`都是用于拦截器的接口,其中`Ordered`是一个标记接口,用于指示实现该接口的类的执行顺序。在实现了`Ordered`接口的拦截器中,可以通过实现`getOrder()`方法来返回一个整数值,该值指示了拦截器的执行顺序,值越小则越先执行。
因此,如果一个拦截器实现了`Ordered`接口并返回了一个比另一个拦截器的返回值更小的整数,则该拦截器会先于另一个拦截器执行。
需要注意的是,如果一个拦截器没有实现`Ordered`接口,则其执行顺序将取决于其在拦截器链中的位置。默认情况下,Spring Boot会按照添加拦截器的顺序执行它们,即先添加的拦截器先执行。
相关问题
springboot中使用拦截器
在Spring Boot中使用拦截器非常简单。您只需遵循以下步骤:
1. 创建一个类并实现`HandlerInterceptor`接口。这个接口定义了在请求处理前、请求处理后以及请求完成后需要执行的方法。
2. 在该类上使用`@Component`注解将其声明为一个Spring组件。
3. 在`WebMvcConfigurer`配置类中重写`addInterceptors`方法,并将您创建的拦截器类添加到`InterceptorRegistry`中。
4. 可选:使用`@Order`注解指定多个拦截器的执行顺序。
以下是一个简单的示例,展示了如何在Spring Boot中使用拦截器来实现日志记录功能:
```java
@Component
public class LoggingInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("Request URL: {}", request.getRequestURL());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在处理完请求后执行
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求完成后执行,包括抛出异常的情况
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private LoggingInterceptor loggingInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loggingInterceptor).order(Ordered.HIGHEST_PRECEDENCE);
}
}
```
以上代码中,`LoggingInterceptor`类实现了`HandlerInterceptor`接口,并在`preHandle`方法中记录了请求的URL。然后,在`WebMvcConfig`配置类中将该拦截器添加到`InterceptorRegistry`中,并使用`@Order`注解指定了拦截器的执行顺序。
springBoot中addInterceptors拦截未生效
如果在Spring Boot中使用拦截器(Interceptor),但是在配置了拦截器后,却发现拦截器并没有生效,可能是以下原因导致的:
1. 拦截器未被注册
在Spring Boot中,要让拦截器生效,需要将其注册到WebMvcConfigurer中。示例代码如下:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
```
在上面的代码中,我们将MyInterceptor注册到WebMvcConfigurer中,并指定了拦截的路径为“/**”。
2. 拦截器配置的路径不正确
在使用addPathPatterns()方法指定拦截路径时,一定要确保路径配置正确。如果路径配置错误,拦截器就无法生效。
3. 拦截器的顺序问题
在多个拦截器的情况下,拦截器的执行顺序可能会影响拦截器的生效情况。可以通过实现Ordered接口或在WebMvcConfigurer中使用addInterceptor()方法传入order参数来指定拦截器的执行顺序。示例代码如下:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor1 myInterceptor1;
@Autowired
private MyInterceptor2 myInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor1).addPathPatterns("/**").order(1);
registry.addInterceptor(myInterceptor2).addPathPatterns("/**").order(2);
}
}
```
在上面的代码中,我们指定了MyInterceptor1先于MyInterceptor2执行。
4. 拦截器被忽略
有些情况下,拦截器可能会被忽略掉,例如静态资源的访问、登录等请求。可以通过配置WebMvcConfigurer的addResourceHandlers()方法或者自定义Filter来解决该问题。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)