Filter和Listener
Listener
自定义自己的Listener,继承需要重写的监听器。
方式一:直接在自定义监听器上面添加注解@WebListener,但是单纯这样是不会被扫描到的(实测不能),所以我们需要加@Component注解,实测@Configuration也行。@WebListener的属性value是对改Listener的描述,感觉没有作用。
Controller接口:
需要使用session,session才会初始化。
看控制台输出:
启动项目,初始化ServletContext
访问接口localhost:8080/test2,使用session,初始化session:
方式二:自定义接口中不写@Component或者@configuration注解,只要@WebListener注解,在启动类中添加注解@ServletComponentScan注解,效果与上面一样。
Filter
Filter的使用配置方式个Listener是一样的,这里就不讨论了,直接使用在启动类添加注解@ServletCompnentScan的方式。
自定义Filter:
MyFilter:
Myfilter2:
可以看到两个Filter上面的注解@WebFilter:
属性: value:配置需要过滤的url路径,/*表示所有,类型String[]
urlPartterns:跟value一样
filterName:过滤器的名字,如果重复,会引起覆盖(这个在另外一种方式会提到)。
启动项目:
过滤器中doFilter方法当中,chain.doFilter(request, response)必须写,目的是该过滤器完成后,交给后边的过滤器继续执行,如果不写,则直接在此处中断。
访问url:
可以看到过滤器2拦截路径/test,不会拦截到/test2,过滤器已经生效。
过滤器的执行过程(跟Listener有点点类似):
注意箭头的到达的地方:
这种@ServletComponentScan的配置方式,过滤器的执行顺序暂时还没找到方法控制,测试@Order注解对Filter的执行顺序无效。但是,不使用@ServletComponentScan,改成使用@Component注解的方式的话,@Order对Filter的执行顺序就有作用了,值越小优先级越高(如图)。或者使用后面的@Bean的方式配置可以指定顺序。
控制台输出:
@Bean的方式配置Listener和Filter
此种方式会用到两个类:
FilterRegistrationBean和ServletListenerRegistrationBean
在官方文档part IV .27.3.但是没有讲怎么使用,用法是百度的。
使用该方式的时候自定义过滤器上面不需要有任何注解,只需要继承Filter即可。
直接在主类中添加@Bean代码(当然,也可以重新建一个类写,为该类添加@Configuration注解即可):
这里会出现两个FilterRegistrationBean,两个都是可以用,建议使用web.servlet的,context.embedded中的是web.servlet中的子类,而且已经过时。
注意:有多少个Filter就要写多少个@Bean方法。
优先级:setOrder方法就是用来设置Filter的执行顺序。值越小,优先级越高。
现在讲MyFilter2设置成1,MyFilter设置成2:执行结果:
Listener的配置和Filter的一样,使用@Bean的方式可以不用在子类上添加任何注解,只需要继承需要的Listener即可,测试通过。
CommendLineRunner启动加载数据
示例工程:springboot-learn
自定义class,继承CommendLineRunner,实现run方法。
启动时加载数据会在tomcat启动完之后加载数据,看结果:
注解@Order可以决定加载的顺序,值越小优先级越高。
over~~~