转载自:https://blog.csdn.net/xadjccl/article/details/82259478
走进SpringBoot之过滤器、监听器、拦截器
该篇主要记录SpringBoot项目中如何使用 过滤器、监听器、拦截器。关于 过滤器、监听器和拦截器有过web开发经验的 同志们都知道,在web.xml中做相对应的配置,指定实现类即可。过滤器只能再web项目中使用,拦截器则都可以。过滤器和拦截器主要可以实现请求过滤,例如我们web项目判断一个请求之前要先拦截判断,是都有权限来访问,session中是否有登录过的标志等等功能。
过滤器
1.首先创建一个SpringBoot项目。创建一个MyFilter 实现接口Filter
@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("MyFilter init ");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("MyFilter doFilter"+req.getParameter("name"));
chain.doFilter(request, response);
return ;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("MyFilter destroy");
}
}
在该类上添加注解
@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})
指定过滤器的名称和要过滤的地址。
2.在入口的启动类上添加注解
@SpringBootApplication
@ServletComponentScan
public class FilterSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(FilterSpringBootApplication.class, args);
}
}
启动项目可以在启动的日志中看见
过滤器已经初始化了。
3.编写controller: FilterController
@Controller
public class FilterController {
@RequestMapping("/testMyFilter")
public String testMyFilter() {
return "Hello Filter";
}
}
重启项目,访问http://127.0.0.1:8080/testMyFilter?name=ccl
控制台输出正确。
至此,一个过滤器就可以使用了,但是在我们平常的工作中一般有多个过滤器,并且要指定每个过滤器的顺序等等,那么用这种方式是没有办法 实现的,可以使用FilterRegistrationBean 来实现
1.将上面项目的 过滤器上的@WebFilter(filterName = "myFilter",urlPatterns = {"/*"}) 去掉,将入口类的@ServletComponentScan去掉。
2.根据之前 的做饭做法再编写一个过滤器: MyFilterTwo
public class MyFilterTwo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("MyFilterTwo init ");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("MyFilterTwo doFilter"+req.getParameter("name"));
chain.doFilter(request, response);
return ;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("MyFilterTwo destroy");
}
}
3. 编写java配置文件FilterConfig
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean =
new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
//指定过滤器的执行顺序
filterRegistrationBean.setOrder(2);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean2() {
FilterRegistrationBean filterRegistrationBean =
new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilterTwo());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
然后启动项目
过滤器初始化成功
访问http://127.0.0.1:8080/testMyFilter?name=ccl
执行成功,且顺序和设置的一致。
监听器
监听器主要是对对象自身的创建和销毁进行监听
主要有ServletContextListener、HttpSessionListener、ServletRequestListener,用法基本一致
下面以HttpSessionListener为例,用来监听 统计当前访问人数。
1.首先创建一个CountListener实现HttpSessionListener
public class CountListener implements HttpSessionListener {
private int count = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
count++;
se.getSession().getServletContext().setAttribute("count", count);
System.out.println("新增在线人数,当前在线人数:"+count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
count--;
se.getSession().getServletContext().setAttribute("count", count);
System.out.println("删减在线人数,当前在线人数:"+count);
}
}
2.创建配置文件类,注册该监听器
@Configuration
public class ListenerConfig {
@Bean
public ServletListenerRegistrationBean<CountListener>
countListenerServletRegistrationBean(){
return new ServletListenerRegistrationBean<CountListener>(
new CountListener());
}
}
3.创建controller
@RestController
public class ListenerConterller {
@RequestMapping("/testListenerLogin")
public String testListenerLogin(HttpServletRequest req) {
System.out.println("当前在线人数"+req.getSession().getId()+":"
+req.getSession().getServletContext().getAttribute("count"));
return "Hello testListenerLogin";
}
}
启动项目 访问http://127.0.0.1:8080/testListenerLogin 可以看见
再 开启一个浏览器访问上述地址
得到我们想要的效果, 当然HttpSessionListener除了创建和销毁方法还有一些其他的方法可以实现。
上面使用java配置文件注册的方式注册监听器,当然还有更简单的,直接使用注解
1.在CountListener类上添加@WebListener注解,标记为监听器
@WebListener
public class CountListener implements HttpSessionListener {
private int count = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
count++;
se.getSession().getServletContext().setAttribute("count", count);
System.out.println("新增在线人数,当前在线人数:"+count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
count--;
se.getSession().getServletContext().setAttribute("count", count);
System.out.println("删减在线人数,当前在线人数:"+count);
}
}
2.在项目的启动类上添加注解@ServletComponentScan扫描
@SpringBootApplication
@ServletComponentScan
public class ListenerSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(ListenerSpringBootApplication.class, args);
}
}
一样启动项目,用两个浏览器访问 http://127.0.0.1:8080/testListenerLogin 可以看见和之前是一样的效果
拦截器
拦截器和过滤器的功能类似,但是是不同的东西
过滤器只能在web项目中使用, 拦截器可以在非web项目中使用。
过滤器是servlet容器支持的,拦截器是spring支持的,所以拦截器可以使用spring的资源,例如数据源,可以注入的对象等等,而过滤器是不行的。
过滤器只在servlet前后起作用,但是拦截器可以深入 到方法前后等等,功能更强大,所以再spring中要优先使用拦截器
.1.首先创建一个项目,创建一个类MyInterceptor 实现HandlerInterceptor
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("preHandle....");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle....");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle....");
}
}
2.创建java配置类InterceptorConfig 继承WebMvcConfigurerAdapter
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter{
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器 拦截规则
//多个拦截器时 以此添加 执行顺序按添加顺序
registry.addInterceptor(myInterceptor).addPathPatterns("/*");
}
}
3.创建controller .
@Controller
public class InterceptorCotroller {
@RequestMapping("/testinterceptor")
public ModelAndView testInterceptor() {
System.out.println("进入controller");
ModelAndView mv = new ModelAndView();
mv.setViewName("aaa");
System.out.println("即将返回modelandview");
return mv;
}
}
---------------------
作者:xadjccl
来源:CSDN
原文:https://blog.csdn.net/xadjccl/article/details/82259478
版权声明:本文为博主原创文章,转载请附上博文链接!