Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法
前言
在编写过滤器、监听器、拦截器之前我们需要在spring-boot启动的类上加上注解@ServletComponentScan:
@SpringBootApplication
@ServletComponentScan
publicclassMySpringbootApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(MySpringbootApplication.class,args);
}
}
Servlet
spring-boot编写过滤器和spring中差不多,直接看代码:
@WebServlet(urlPatterns="/serv")
publicclassMyServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse){
System.out.println("------------doget-------------");
doPost(request,response);
}
@Override
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse){
System.out.println("------------dopost-------------");
}
}
其实也就是注解的不同而已:
@WebServlet(urlPatterns="/serv")
过滤器(Filter)
在spring-boot里编写过滤器我们只需要实现javax.servlet.Filter
@WebFilter(filterName="myFilter",urlPatterns="/*")
publicclassMyFilterimplementsFilter{
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
System.out.println("初始化过滤器");
}
@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
System.out.println("执行过滤器");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
publicvoiddestroy(){
System.out.println("销毁过滤器!");
}
}
然后添加一个注解:
@WebFilter(filterName="myFilter",urlPatterns="/*")
监听器(Listener)
在上面,看了下过滤器的使用。其实监听器和拦截器就差不多了,直接上代码:
@WebListener
publicclassMyHttpSessionListenerimplementsHttpSessionListener{
@Override
publicvoidsessionCreated(HttpSessionEventhttpSessionEvent){
System.out.println("session被创建");
}
@Override
publicvoidsessionDestroyed(HttpSessionEventhttpSessionEvent){
System.out.println("session被摧毁");
}
}
我们发现只是注解发生了变化:
@WebListener
拦截器(Interceptor)
拦截器大致和上面差不多,不过有一点点不同。我们知道在web开发中,可以使用过滤器和拦截器来过滤外部的web请求。但是拦截器提供了更加细致的控制功能。主要有:请求之前、请求之后渲染之前、渲染之后、请求全部结束之后这四个步骤的拦截。
这里面使用拦截器主要有三个步骤
自定义拦截器,实现org.springframework.web.servlet.HandlerInterceptor
自定义WebAppConfigurer,继承WebMvcConfigurerAdapter
在自定义的WebAppConfigurer覆盖父类方法addInterceptors(InterceptorRegistryregistry),并在方法中添加自己定义的拦截器
publicclassMyInterceptorimplementsHandlerInterceptor{
@Override
publicbooleanpreHandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto)throwsException{
System.out.println(MyInterceptor.class.getName()+":在请求之前调用");
returntrue;
}
@Override
publicvoidpostHandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto,ModelAndViewmodelAndView)throwsException{
System.out.println(MyInterceptor.class.getName()+":请求处理之后视图渲染之前使用");
}
@Override
publicvoidafterCompletion(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto,Exceptione)throwsException{
System.out.println(MyInterceptor.class.getName()+":请视图渲染之后使用");
}
}
@Configuration
publicclassMyWebAppConfigurerextendsWebMvcConfigurerAdapter{
@Override
publicvoidaddInterceptors(InterceptorRegistryregistry){
//多个拦截器组成一个拦截器链
//addPathPatterns用于添加拦截规则
//excludePathPatterns用户排除拦截
registry.addInterceptor(newMyInterceptor()).addPathPatterns("/**");
registry.addInterceptor(newMyInterceptor2()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
以上就是关于在spring-boot中如何定义过滤器、监听器和拦截器。关于他们的原理以及一些细节问题(如拦截器的拦截顺序),就不详述。有兴趣的可以去网上搜索。