两者区别
两者区别:
Filter
属于servlet
组件,interceptor
属于Spring
内置组件- 多个
Filter
存在时按照文件的排列顺序依次执行 Filter
会拦截所有的资源而interceptor
只拦截Spring
环境中的资源Filter
的执行流程在interceptor
之前, 也就是先执行过滤器再执行拦截器
执行流程图如下:
Filter实现
第一步 定义过滤器, 实现
servlet
包下的Filter
接口, 并重写其所有方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class LoginFilter:Filter {
/**
* 请求拦截
*/
override fun doFilter(
request: ServletRequest?,
response: ServletResponse?,
chain: FilterChain?
) {
//放行
chain?.doFilter(request,response)
}
/**
* 服务启动时调用 只调用一次
*/
override fun init(filterConfig: FilterConfig?) {
super.init(filterConfig)
}
/**
* 服务关闭时调用
*/
override fun destroy() {
super.destroy()
}
}
第二步 项目启动入口类上添加
@ServletComponentScan
开启servlet
组件支持1
2
3
4
5
6
7
8
9
10
11
12
13/
open class MainApplication {
companion object {
fun main(args: Array<String>) {
SpringApplication.run(MainApplication::class.java, *args)
}
}
}
Interceptor实现
Cookie
第一步 定义拦截器, 实现
HandlerInterceptor
接口 并重写其所有方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class LoginCheckInterceptor :HandlerInterceptor {
/**
* 在目标方法执行前执行 返回true放行 否则不放行
*/
override fun preHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any
): Boolean {
return true
}
/**
* 在目标方法执行后执行
*/
override fun postHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
modelAndView: ModelAndView?
) {
}
/**
* 最后执行
*/
override fun afterCompletion(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
ex: Exception?
) {
}
}
第二步 创建配置类 并将刚定义的拦截器添加进配置类中
1
2
3
4
5
6
7
8
9
10
open class WebConfig : WebMvcConfigurer {
lateinit var loginCheckInterceptor: LoginCheckInterceptor
override fun addInterceptors(registry: InterceptorRegistry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**") //拦截所有路径
}
}
本文为作者原创转载时请注明出处 谢谢