springMVC拦截器和过滤器
时间: 2025-02-07 18:15:55 浏览: 32
### Spring MVC 中拦截器与过滤器的区别
#### 实现机制差异
Java Servlet 过滤器作为Servlet API的一部分,属于更底层的技术,能够处理所有进入Web应用程序的HTTP请求和响应。相比之下,Spring MVC拦截器是框架层面的概念,主要针对的是经过Spring DispatcherServlet分发后的控制器层请求。
```java
// 定义一个简单的过滤器类
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response;
// 执行前置逻辑
chain.doFilter(request,response); // 继续后续链路
// 执行后置逻辑
}
}
```
对于拦截器而言,则需继承`HandlerInterceptor`接口或其适配器类,并重写相应的方法来定义拦截行为:
```java
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
// 前置处理代码...
return true; // 返回true表示继续执行下一个拦截器/目标方法;false则终止当前请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
// 后置处理器,在视图渲染前调用
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
// 请求完成之后的操作
}
}
```
#### 功能特性对比
- **适用范围**:过滤器适用于整个Web应用下的任何URL模式匹配到的资源访问控制,而拦截器只限于被Spring管理的组件之间的交互。
- **依赖关系**:由于过滤器是由Servlet容器初始化并维护生命周期的对象,因此它天然地依赖于具体的Web服务器环境。相反,拦截器完全由Spring上下文管理和配置,更加灵活独立[^1]。
- **集成能力**:得益于Spring IoC/DI的支持,拦截器更容易与其他Bean协作工作,例如注入服务实例用于业务校验等复杂场景下具有明显优势[^2]。
#### 配置方式的不同
在XML配置文件中注册过滤器的方式如下所示:
```xml
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
```
而在Spring Boot环境下声明拦截器更为简洁直观:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final MyInterceptor myInterceptor;
@Autowired
public WebConfig(MyInterceptor myInterceptor) {
this.myInterceptor = myInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/admin/**");
}
}
```
阅读全文
相关推荐


















