它依赖于servlet容器。它可以对几乎所有请求进行过滤。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。
通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。
它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制。
属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。
由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。拦截器可以对静态资源的请求进行拦截处理。
1、Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
2、Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
3、Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
4、Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
5、在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
6、Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。
kotlin 的springboot项目
import org.apache.catalina.connector.RequestFacade
import java.io.IOException
import javax.servlet.*
import javax.servlet.annotation.WebFilter
@WebFilter(urlPatterns = ["/test/*"])
class RootCustomerFilter : Filter {
@Throws(IOException::class, ServletException::class)
override fun doFilter(servletRequest: ServletRequest, servletResponse: ServletResponse, filterChain: FilterChain) {
println(servletRequest.localAddr)
println((servletRequest as RequestFacade).requestURI)
filterChain.doFilter(servletRequest, servletResponse)
}
@Throws(ServletException::class)
override fun init(filterConfig: FilterConfig) {
super.init(filterConfig)
}
override fun destroy() {
super.destroy()
}
}
这是一个自定义的filter,实现FIlter接口。在doFilter方法中进行处理,改变请求的内容。
除了要在类上添加@WebFilter注解,指定要过滤的路径外,还要在启动类配置注解@ServletComponentScan(basePackages = [“com.example.filterinterceptor.filter”])指定filter的位置,这样就可以使用到此filter。
import org.springframework.web.servlet.HandlerInterceptor
import org.springframework.web.servlet.ModelAndView
import java.lang.Exception
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
class CustomerInterceptor : HandlerInterceptor{
override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
println("this is preHandle into ...")
return super.preHandle(request, response, handler)
}
override fun postHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
modelAndView: ModelAndView?
) {
super.postHandle(request, response, handler, modelAndView)
}
override fun afterCompletion(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
ex: Exception?
) {
super.afterCompletion(request, response, handler, ex)
}
}
定义了拦截器之后,还需要配置:
import com.example.filterinterceptor.interceptor.CustomerInterceptor
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport
@Configuration
class WebConfig: WebMvcConfigurationSupport() {
override fun addInterceptors(registry: InterceptorRegistry) {
super.addInterceptors(registry)
val pathPatterns = "/test/**"
val excludePathPatterns = "/api/**"
registry.addInterceptor(CustomerInterceptor()).addPathPatterns(pathPatterns).excludePathPatterns(excludePathPatterns)
}
}
这样就可以使用此拦截器,对请求进行处理了。