一、关系图理解

二、区别
1.过滤器
- 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁
- 可以对请求的URL进行过滤, 对敏感词过滤
- 挡在拦截器的外层
- 实现的是 javax.servlet.Filter 接口 ,是 Servlet 规范的一部分
- 在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后
- 依赖Web容器
- 会多次执行
1.1HttpServletRequestWrapper
“
在请求到达之前对 request 进行修改
1.2 OncePerRequestFilter
“
OncePerRequestFilter,顾名思义,它能够确保在一次请求中只通过一次filter
1.3 配置
2.拦截器
- 实现 org.springframework.web.servlet.HandlerInterceptor 接口,动态代理
- 拦截器应用场景, 性能分析, 权限检查, 日志记录
- 是一个Spring组件,并由Spring容器管理,并不
- 依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中
- 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束
2.1登录拦截
2.2配置
3.监听器
- 实现 javax.servlet.ServletRequestListener, javax.servlet.http.HttpSessionListener, javax.servlet.ServletContextListener 等等接口
- 主要用来监听对象的创建与销毁的发生, 比如 session 的创建销毁, request 的创建销毁, ServletContext 创建销毁
三、注意
1.静态资源问题
“
SpringBoot2.x以后版本拦截器也会拦截静态资源,在配置拦截器是需要将姿态资源放行。
“
SpringBoot2.x 自定义静态资源映射
“
默认目录 classpath:/META-INF/resources classpath:/resources classpath:/static classpath:/public 优先级:META-INF/resources > resources > static > public
2.登录拦截ajax重定向
“
由于ajax是异步的,还在当前页面进行的局部请求。当拦截到登录请求时,即使重定向也无法生效。需采用服务端给地址由前端进行跳转。详细见登录拦截器代码。
四、测试
“
代码地址:https://gitee.com/dingwen-gitee/filter-interceptor-study.git
1.拦截器测试
1.1启动项目访问首页
“
由于没有登录,直接重定向到了登录页

1.2输入用户名密码完成登录,调转到用户页


“
此时在访问首页

1.2 退出登录
“
成功退出后,访问为授权的页面也相对会被重定向到登录页

1.3 ajax未授权访问测试

“
点击访问user ,由于未登录,没有全权访问。在前端进行了页面跳转,转到了登录页。

2.过滤器测试


“
可以看到过滤器进行了相对应的处理,重写的getParameterValues()也生效了。配合使用HttpServletRequestWrapper & OncePerRequestFilter 实现了对request的修改。


所有评论(0)