SpringBoot攔截器和 Servlet3.0自定義Filter、Listener(springboot2.0系列-四)

SpringBoot攔截器和 Servlet3.0自定義Filter、Listener


1、SpringBoot2.x過濾器Filter和使用Servlet3.0配置自定義Filter

簡介:SpringBoot裏面Filter和使用Servlet3.0配置自定義Filter

filter簡單理解:人—>檢票員(filter)—> 景點

1)、SpringBoot啓動默認加載的Filter

  • characterEncodingFilter
  • hiddenHttpMethodFilter
  • httpPutFormContentFilter
  • requestContextFilter

2)、Filter優先級

Ordered.HIGHEST_PRECEDENCE

Ordered.LOWEST_PRECEDENCE

低位值意味着更高的優先級 Higher values are interpreted as lower priority

自定義Filter,避免和默認的Filter優先級一樣,不然會衝突

註冊Filter的bean FilterRegistrationBean

同模塊裏面有相關默認Filter
web->servlet->filter

3)、自定義Filter

  • 使用Servlet3.0的註解進行配置
  • 啓動類裏面增加 @ServletComponentScan,進行掃描
  • 新建一個Filter類,implements Filter,並實現對應的接口
  • @WebFilter 標記一個類爲filter,被spring進行掃描
    urlPatterns:攔截規則,支持正則
  • 控制chain.doFilter的方法的調用,來實現是否通過放行
    不放行,web應用resp.sendRedirect(“/index.html”);
    場景:權限控制、用戶登錄(非前端後端分離場景)等

官方文檔:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

2、Servlet3.0的註解自定義原生Servlet

1、自定義原生Servlet

        @WebServlet(name = "userServlet",urlPatterns = "/test/customs")
        public class UserServlet extends HttpServlet{

             @Override
             public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 resp.getWriter().print("custom sevlet");
                 resp.getWriter().flush();
                 resp.getWriter().close();
             }

             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 this.doGet(req, resp);
             }
        }

3、Servlet3.0的註解自定義原生Listener監聽器

1、自定義Listener(常用的監聽器 servletContextListener、httpSessionListener、servletRequestListener)

        @WebListener
        public class RequestListener implements ServletRequestListener {

        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            // TODO Auto-generated method stub
            System.out.println("======requestDestroyed========");
        }

        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            System.out.println("======requestInitialized========");

        }

4、SpringBoot2.X自定義攔截器及和Filter比較(核心)

1、@Configuration

SpringBoot2.X之前舊版本繼承WebMvcConfigurationAdapter
SpringBoot2.X 新版本配置攔截器 implements WebMvcConfigurer

2、自定義攔截器 HandlerInterceptor

  • preHandle:調用Controller某個方法之前
  • postHandle:Controller之後調用,視圖渲染之前,如果控制器Controller出現了異常,則不會執行此方法
  • afterCompletion:不管有沒有異常,這個afterCompletion都會被調用,用於資源清理

3、按照註冊順序進行攔截,先註冊,先被攔截

攔截器不生效常見問題:

  • 是否有加@Configuration
  • 攔截路徑是否有問題 * 和
  • 攔截器最後路徑一定要 “/*”, 如果是目錄的話則是 //

4、Interceptor和Filter比較

  • Filter是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
  • Filter在只在Servlet前後起作用,而Interceptor夠深入到方法前後、異常拋出前後等
  • Filter依賴於Servlet容器即web應用中,而Interceptor不依賴於Servlet容器所以可以運行在多種環境
  • 在接口調用的生命週期裏,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。
  • Filter和Interceptor的執行順序:過濾前->攔截前->action執行->攔截後->過濾後
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章