美文网首页SpringBoot
第二章 SpringBoot整合过滤器、监听器

第二章 SpringBoot整合过滤器、监听器

作者: liaijuyyer | 来源:发表于2021-11-14 23:09 被阅读0次

一 整合过滤器

在SpringBoot项目中要实现自己的过滤器很简单 只需要如下几步即可

  • 集成starter-web依赖
     <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  • 实现Filter接口
      //@Order(1) @Order注解并不能控制filter的执行顺序 它只能决定spring容器装载bean的一个顺序 如果你需要对filter的执行顺序
      //做控制 建议使用 FilterRegistration
      @WebFilter(filterName = "MyFilter", urlPatterns = "/*")
      public class MyFilter implements Filter {
      
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("过滤器初始化");
              Filter.super.init(filterConfig);
          }
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              System.out.println("进行过滤处理");
              chain.doFilter(request, response);
          }
      
          @Override
          public void destroy() {
              Filter.super.destroy();
              System.out.println("销毁过滤器");
          }
      }
    
  • 在启动类上添加@ServletComponentScan注解
      //@ServletComponentScan 默认会扫描当前类(启动类)所在包及其子包下的所有的servlet相关注解
      @ServletComponentScan
      @SpringBootApplication
      public class SpringbootDemo1Application {
      
          public static void main(String[] args) {
              SpringApplication.run(SpringbootDemo1Application.class, args);
          }
      
      }
    
  • 使用FilterRegistrationBean注册filter
    如果基于注解方式不够灵活 也可以通过ServletRegistrationBean、FilterRegistrationBean、以及ServletListenerRegistrationBean类来将Servlet、Filter和Listener来注册为spring的bean 同样也可以达到上面的效果。这里演示如何利用FilterRegistration类来实现filter
      //过滤器一 不需要加任何的注解
      public class MyFilter implements Filter {
      
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("过滤器初始化1");
              Filter.super.init(filterConfig);
          }
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              System.out.println("进行过滤处理1");
              chain.doFilter(request, response);
          }
      
          @Override
          public void destroy() {
              Filter.super.destroy();
              System.out.println("销毁过滤器1");
          }
      }
      
      //过滤器二 不需要加任何的注解
      public class MyFilter2 implements Filter {
      
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              Filter.super.init(filterConfig);
              System.out.println("过滤器初始化2");
          }
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              System.out.println("进行过滤处理2");
              chain.doFilter(request, response);
          }
      
          @Override
          public void destroy() {
              Filter.super.destroy();
              System.out.println("销毁过滤器2");
          }
      }
      
      //启动类也不需要加@ServletComponentScan注解进行扫描
      @SpringBootApplication
      public class SpringbootDemo1Application {
      
          public static void main(String[] args) {
              SpringApplication.run(SpringbootDemo1Application.class, args);
          }
      
      }
      
      //新增一个配置类
      @Configuration
      public class FilterConfig {
              
          //利用FilterRegistrationBean将filter装配为一个bean 并且通过setOrder方法去控制filter的执行顺序
          @Bean
          public FilterRegistrationBean filterRegistration() {
              FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
              registration.setFilter(new MyFilter());
              registration.addUrlPatterns("/*");
              registration.setOrder(1); //过滤器的执行顺序
              registration.setName("MyFilter");
              return registration;
          }
      
          @Bean
          public FilterRegistrationBean filterRegistration2() {
              FilterRegistrationBean<MyFilter2> registration = new FilterRegistrationBean<>();
              registration.setFilter(new MyFilter2());
              registration.addUrlPatterns("/*");
              registration.setOrder(2); //过滤器的执行顺序
              registration.setName("MyFilter2");
              return registration;
          }
      }
    

二 集成监听器

listener是servlet规范定义的一种特殊类,用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件,用于在事件发生前、发生后做一些必要的处理。可用于以下方面1、统计在线人数和在线用户 2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径

  • 利用@WebListener注解创建监听器
      //监听器需要自己去实现相应的listener接口 @WebListener注解 需要与@ServletComponentScan注解配合使用
      //listener才会生效
      @WebListener
      public class MySessionListener implements HttpSessionListener {
          @Override
          public void sessionCreated(HttpSessionEvent se) {
              System.out.println("创建session");
          }
      
          @Override
          public void sessionDestroyed(HttpSessionEvent se) {
              System.out.println("销毁session");
          }
      }
      
      //启动类 加上@ServletComponentScan注解
      @ServletComponentScan
      @SpringBootApplication
      public class SpringbootDemo1Application {
      
          public static void main(String[] args) {
              SpringApplication.run(SpringbootDemo1Application.class, args);
          }
      
      }
      
      //测试类 需要通过request.getSession()触发HttpSessionListener监听的事件
      @RestController
      public class TestController {
      
          @RequestMapping(path = "/hello", method = RequestMethod.GET)
          public String hello(HttpServletRequest request) {
              request.getSession(); //触发session的创建
              return "hello";
          }
      }
    
  • 利用ServletListenerRegistrationBean创建listener
    ServletListenerRegistrationBean创建listener 可以对listener进行一些细粒度的控制 如listener的执行顺序等
      //不需要加任何的注解 启动类上也不需要加@ServletComponentScan注解
      public class MySessionListener implements HttpSessionListener {
          @Override
          public void sessionCreated(HttpSessionEvent se) {
              System.out.println("创建session");
          }
      
          @Override
          public void sessionDestroyed(HttpSessionEvent se) {
              System.out.println("销毁session");
          }
      }
      
      @Configuration
      public class ListenerConfig {
          
          //通过ServletListenerRegistrationBean的方式将listener注入到spring容器中
          @Bean
          public ServletListenerRegistrationBean<MySessionListener> listenerRegistrationBean() {
              ServletListenerRegistrationBean<MySessionListener> registrationBean = new ServletListenerRegistrationBean<>();
              registrationBean.setListener(new MySessionListener());
              registrationBean.setOrder(1); //设置监听器的执行顺序
              return registrationBean;
          }
      }
      
      //测试类
      @RestController
      public class TestController {
      
          @RequestMapping(path = "/hello", method = RequestMethod.GET)
          public String hello(HttpServletRequest request) {
              request.getSession(); //触发session的创建
              return "hello";
          }
      }
      
      //启动类
      @SpringBootApplication
      public class SpringbootDemo1Application {
      
          public static void main(String[] args) {
              SpringApplication.run(SpringbootDemo1Application.class, args);
          }
      
      }
    

三 静态资源的配置

默认情况下,SpringBoot将在classpath或者ServletContext根目录下从名为/static(/pulic、/resources、或/META-INF/resources)目录中加载静态资源。它使用了SpringMVC的ResourceHttpRequestHandler,因此也可以通过实现WebMvcConfigurer接口重写addResourceHandlers方法来自己自定义springboot中的静态资源目录
示例

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //过滤swagger 如果访问的uri是swagger-ui.html 将会映射到classpath:/META-INF/resources/这个目录下去找对应的静态资源
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

        registry.addResourceHandler("/swagger-resources/**")
                .addResourceLocations("classpath:/META-INF/resources/swagger-resources/");

        registry.addResourceHandler("/swagger/**")
                .addResourceLocations("classpath:/META-INF/resources/swagger*");

        registry.addResourceHandler("/v2/api-docs/**")
                .addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
    }
}

相关文章

网友评论

    本文标题:第二章 SpringBoot整合过滤器、监听器

    本文链接:https://www.haomeiwen.com/subject/dxlftrtx.html