前言:
本节课介绍:
1.自定义过滤器Filter
2.Servlet3的使用
3.自定义Listenter
4.自定义拦截器Interceptor
一.filter
关于过滤器的含义本章不会过多陈述,不了解的可以百度查找,资料很多。
filter简单理解:人--->检票员(filter)---> 景点
1、SpringBoot启动默认加载的Filter
characterEncodingFilter
hiddenHttpMethodFilter
httpPutFormContentFilter
requestContextFilter
我们通过启动springboot程序也是可以看到的
映射的URL
2、Filter优先级
我们查看Ordered接口
Ordered.HIGHEST_PRECEDENCE
获得优先级的方法
低位值意味着更高的优先级 Higher values are interpreted as lower priority
自定义Filter,避免和默认的Filter优先级一样,不然会冲突
注册Filter的bean FilterRegistrationBean
同模块里面有相关默认Filter
web->servlet->filter
3、自定义Filter
1)使用Servlet3.0的注解进行配置
2)启动类里面增加 @ServletComponentScan,进行扫描(在主程序类上面添加)
3)新建一个Filter类,implements Filter,并实现对应的接口
4) @WebFilter 标记一个类为filter,被spring进行扫描
urlPatterns:拦截规则,支持正则
5)控制chain.doFilter的方法的调用,来实现是否通过放行
不放行,web应用resp.sendRedirect("/index.html");
场景:权限控制、用户登录(非前端后端分离场景)等
6)当我们启动工程发现自定义的过滤器也添加到里面了
7)这时候我们访问之前的controller里面的方法
只是过滤api方法
8)修改访问路径
添加index.html页面
访问执行doFilter方法
9)访问时没有username调转到index.html
10)传入参数 doFilter放行
官网地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners
官网上过滤器的顺序
二.Servlet3.0的注解自定义原生Servlet实战
在开发一些小项目的时候有时候会用到Servlet,所以我们需要用到Servlet3.0的注解
讲解:使用 Servlet3.0的注解自定义原生Servlet和Listener
1、自定义原生Servlet (记得要在主程序添加@ServletComponentScan 才能扫到@webServlet的注解)
启动访问即可
三、Servlet3.0的注解自定义原生Listener监听器实战
简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战
1、自定义Listener(常用的监听器 servletContextListener、httpSessionListener、servletRequestListener)
servletRequestListener
1)
2)
3)
4)查看控制台
servletContextListener
servletContextListener:应用上下文监听器,启动应用的时候,就进行调用
1)
2)启动监听器初始化(可以用于初始化一些缓存数据)
四.SpringBoot2.X自定义拦截器实战及新旧配置对比(核心知识)
简介: 讲解拦截器使用,Spingboot2.x新版本配置拦截拦截器和旧版本SpringBoot配置拦截器区别讲解
1、@Configuration
继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)
源码
SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer
2、自定义拦截器 HandlerInterceptor
preHandle:调用Controller某个方法之前
postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
1)
2)访问我们controller的方法
3)
4)查看控制台
注意:如果不希望拦截api2文件夹下的某一个方法
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api2/*").excludePathPatterns("/api2/xxx/**")
3、按照注册顺序进行拦截,先注册,先被拦截
再添加一个自定义拦截器执行顺序怎么样呢?
1)同理
2)同理
3)启动访问
4)注意变化
拦截器不生效常见问题:
1)是否有加@Configuration
2)拦截路径是否有问题 ** 和 *
3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/
Filter与Interceptor区别
1. 是基于函数回调 doFilter(),而Interceptor则是基于AOP思想
2. Filter在只在Servlet前后起作用,而Interceptor够深入到方法前后、异常抛出前后等
3. 依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境。
4. 在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
Filter和Interceptor的执行顺序
过滤前->拦截前->action执行->拦截后->过滤后
有兴趣的可以自行测试
注意过滤器路径这样配置
1)初始化
2)结果
总结
1.拦截器,过滤器,监听器对比
2.三者启动顺序:
监听器 > 过滤器 > 拦截器
我是这样记忆的:接到上级命令,要求对电话进去监听,过滤出恐怖分子,然后,拦截他们的恐怖袭击行动。
配置位置:(用SSM框架开发的情况)
监听器、过滤器一般配置在web.xml中,拦截器一般配置在springmvc.xml配置文件中
1) 一启动过滤器进行初始化
2) 注意顺序