验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Springboot中filter的原理与注册方法是什么

阅读:972 来源:乙速云 作者:代码code

Springboot中filter的原理与注册方法是什么

      1、filter

      先看下web服务器的filter所处的位置。filter是一个前后连接的链,前面处理完成之后传递给下一个filter处理。

      Springboot中filter的原理与注册方法是什么

      1.1 filter的接口定义

      public interface Filter {
          //初始化方法,整个生命周期中只执行一次。
          //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。
          //参数FilterConfig用于获取初始化参数
          public void init(FilterConfig filterConfig) throws ServletException;
       
          //执行过滤任务的方法,参数FilterChain表示过滤器链,doFilter方法中只有执行chain.doFilter()后才能调用下一个过滤器的doFilter方法
          //才能将请求交经下一个Filter或Servlet执行
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
       
          //销毁方法,当移出服务时由web容器调用。整个生命周期中destroy方法只会执行一次
          //destroy方法可用于释放持有的资源,如内存、文件句柄等
          public void destroy();
      }

      filter的入参是request和response,filter一般是用来做一些预处理工作,比如做一些检查,验证等工作。

      1.2 自定义filter

      public class LoginFilter implements Filter {
          @Override
          public void destroy() {
              System.out.println("filter destroy method");
          }
          @Override
          public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
                  throws IOException, ServletException {
              System.out.println("filter doFilter method ");
              // 继续传递下去
              filterChain.doFilter(arg0,arg1);
          }
          @Override
          public void init(FilterConfig arg0) throws ServletException {
              System.out.println("filter init method");
          }
      }

      2、springboot中filter注册几种方式

      2.1 手动注册

      @Configuration
      public class FilterConfig {
          @Bean
          public FilterRegistrationBean indexFilterRegistration() {
              FilterRegistrationBean registration = new FilterRegistrationBean(new LoginFilter());
              registration.addUrlPatterns("/");
              return registration;
          }
      }

      2.2 注解注册

      2.2.1 在filter上增加注解@WebFilter

      @WebFilter(urlPatterns = "/",filterName = "filter1")
      @Order(1)
      public class LoginFilter implements Filter {
          @Override
          public void destroy() {
              System.out.println("filter destroy method");
          }
       
          @Override
          public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
                  throws IOException, ServletException {
              System.out.println("filter doFilter method   1   ");
              filterChain.doFilter(arg0,arg1);
          }
       
          @Override
          public void init(FilterConfig arg0) throws ServletException {
              System.out.println("filter init method");
          }
      }

      2.2.2 在启动类上增加注解@ServletComponentScan

      @SpringBootApplication
      @ServletComponentScan
      public class FilterTestApplication {
          public static void main(String[] args) {
              SpringApplication.run(FilterTestApplication.class, args);
          }
      }

      注:

      @ServletComponentScan 会扫描所有的带有@WebFilter的类,并且注册为servlet。

      如果启动类不添加此注解,在filter上添加Component注解也可以注册为filter

      order注解可以调整filter的顺序

      2.3 通过servletContext 注册

      @Autowired ServletContext servletContext; servletContext.addFilter()

      3、原理

      3.1 ServletContext

      Web容器在启动时会为每个web应用创建一个ServletContext对象,而这个ServletContext对象就代表当前这个web应用。

      一个ServletContext对象代表一个web应用,web应用中所有的Servlet和其他资源都共享一个ServletContext对象,

      如果有必要我们就可以通过ServletContext对象进行Servlet之间的通讯。

      ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。

      Springboot中filter的原理与注册方法是什么

      ApplicationContext 是ServletContext的实现类,可以看到里面有相应的注册的方法

      在程序中获取ServletContext

      3.1.1 使用自动注入

      @Autowired private ServletContext servletContext;

      3.1.2 request获取servletContext

      ServletContext servletContext = request.getServletContext();

      3.1.3 实现 ServletContextListener

      @Component
      public class TestListener implements ServletContextListener {
          @Override
          public void contextInitialized(ServletContextEvent sce) {
              System.out.println(sce);
          }
      }

      3.2 ServletRegistrationBean

      看下Filter的定义,可以看到和webfilter注解内容一样

      public class ServletRegistrationBean extends DynamicRegistrationBean {
          private static final String[] DEFAULT_MAPPINGS = new String[]{"/*"};
          private T servlet;
          private Set urlMappings;
          private boolean alwaysMapUrl;
          private int loadOnStartup;
          private MultipartConfigElement multipartConfig;
          ......
          }

      在开发中一般使用他的子类FilterRegistrationBean,使用上面2.1 手动注册。

    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>