首頁  >  文章  >  Java  >  Springboot中filter的原理與註冊方法是什麼

Springboot中filter的原理與註冊方法是什麼

WBOY
WBOY轉載
2023-05-11 20:28:041411瀏覽

    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<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
        private static final String[] DEFAULT_MAPPINGS = new String[]{"/*"};
        private T servlet;
        private Set<String> urlMappings;
        private boolean alwaysMapUrl;
        private int loadOnStartup;
        private MultipartConfigElement multipartConfig;
        ......
        }

    在開發中一般使用他的子類別FilterRegistrationBean,使用上面2.1 手動註冊。

    以上是Springboot中filter的原理與註冊方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除