Spring Interceptor 与 Filter 的区别
在 Web 应用程序中,Filter
和Interceptor
都是用于处理请求和响应的重要组件。它们可以在请求处理的不同阶段进行干预,实现诸如身份验证、日志记录、数据过滤等功能。本文将详细介绍 Spring 中Interceptor
和Filter
的实现方式,帮助您更好地理解和应用这两种技术。
一、Interceptor 和 Filter 的区别
Interceptor
和Filter
都是 AOP(面向切面编程)的实现方式,但它们有一些区别:
- 拦截对象不同:
Interceptor
主要用于拦截控制器方法的执行,而Filter
可以拦截所有的请求和响应。 - 执行顺序不同:
Filter
的执行顺序在Interceptor
之前。 - 配置方式不同:
Interceptor
通常通过配置类或注解进行配置,而Filter
需要在web.xml
文件中进行配置。
二、Filter 的实现方式
在 Spring 中,创建Filter
非常简单。您只需要创建一个实现了Filter
接口的类,并在该类中实现相应的方法即可。Filter
接口定义了三个方法:
init(FilterConfig filterConfig)
:在Filter
初始化时被调用。doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
:在请求处理过程中被调用。如果返回true
,则继续执行后续的Filter
;否则,中断请求处理。destroy()
:在Filter
销毁时被调用。
三、Interceptor 的实现方式
Interceptor
的实现方式, 要实现HandlerInterceptor
接口,或者继承HandlerInterceptorAdapter
类,然后覆写下面几个方法:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:在控制器处理请求之前被调用。如果返回true则继续流程,返回false则中断。postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:在控制器处理请求后,视图被渲染之前被调用。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
:在整个请求完成后被调用,即视图被渲染后。
例如:
四、配置 Filter
在Spring框架中,添加过滤器(Filter)通常有以下几种方式:
1. 通过WebFilter
注解
在Spring Boot应用程序中,你可以直接在Filter类上使用@WebFilter
注解来注册一个过滤器。
1 | import javax.servlet.Filter; |
2. 通过FilterRegistrationBean
在Spring配置类中,你可以使用FilterRegistrationBean
来注册过滤器。
1 | import org.springframework.boot.web.servlet.FilterRegistrationBean; |
3. 通过DelegatingFilterProxy
如果你的过滤器需要被Spring容器管理(例如,需要注入Spring管理的Bean),你可以使用DelegatingFilterProxy
。
首先,你需要在Spring配置中声明一个Bean:
1 | import org.springframework.context.annotation.Bean; |
然后,在web.xml
中配置DelegatingFilterProxy
:
1 | <filter> |
或者,如果你使用的是Spring Boot,你可以在application.properties
或application.yml
中配置:
1 | # application.properties |
确保你的过滤器实现了javax.servlet.Filter
接口,并覆盖了doFilter
方法。上述任何一种方式都可以在Spring应用程序中添加并注册过滤器。
五、配置 Interceptor
在Spring框架中,添加拦截器(Interceptor)通常用于处理HTTP请求,例如日志记录、权限检查或请求预处理。以下是在Spring应用程序中添加拦截器的方法:
1. 实现HandlerInterceptor
接口
首先,创建一个类实现HandlerInterceptor
接口,并覆盖其中的方法。
1 | import org.springframework.web.servlet.HandlerInterceptor; |
2. 注册拦截器
接下来,你需要将拦截器注册到Spring的拦截器链中。这通常在配置类中完成。
1 | import org.springframework.context.annotation.Configuration; |
在上面的代码中,addPathPatterns
方法用于指定拦截器应该拦截哪些路径,而excludePathPatterns
方法用于排除一些路径不进行拦截。
注意事项:
preHandle
方法返回true
时,请求将继续被处理;返回false
时,请求将被终止。postHandle
方法在Controller
方法执行完毕后调用,但在视图渲染之前。afterCompletion
方法在整个请求完成后调用,即在视图渲染之后。
通过上述步骤,你可以在Spring MVC应用程序中添加并注册一个拦截器。拦截器提供了一种方便的方式来处理请求前后的逻辑,而无需修改实际的业务逻辑。
六、总结
Interceptor
和Filter
都是 Spring 框架中非常重要的组件,它们可以帮助您实现对请求和响应的拦截和处理,从而实现各种横切关注点的功能。本文详细介绍了Interceptor
和Filter
的实现方式、区别、配置和使用,希望对您有所帮助。