1. 程式人生 > >SpringBoot2.x過濾器Filter和使用Servlet3.0配置自定義Filter實戰

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

補充:SpringBoot啟動日誌

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
    1)使用Servlet3.0的註解進行配置
    2)啟動類裡面增加 @ServletComponentScan,進行掃描
    3)新建一個Filter類,implements Filter,並實現對應的介面
    4) @WebFilter 標記一個類為filter,被spring進行掃描
      urlPatterns:攔截規則,支援正則

    5)控制chain.doFilter的方法的呼叫,來實現是否通過放行
    不放行,web應用resp.sendRedirect("/index.html");
    場景:許可權控制、使用者登入(非前端後端分離場景)等

    1、官網地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

   程式碼示例:

  啟動類中加入@ServletComponentScan註解

  

  LoginFilter.java:

 1 package net.xdclass.demo.Filter;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 
15 
16 @WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
17 public class LoginFilter implements Filter{
18     
19     
20     
21      /**
22       * 容器載入的時候呼叫
23       */
24       @Override
25       public void init(FilterConfig filterConfig) throws ServletException {
26           System.out.println("init loginFilter");
27       }
28 
29       
30       /**
31        * 請求被攔截的時候進行呼叫
32        */
33       @Override
34       public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
35           System.out.println("doFilter loginFilter");
36           
37           HttpServletRequest req = (HttpServletRequest) servletRequest;
38           HttpServletResponse resp = (HttpServletResponse) servletResponse;
39           String username = req.getParameter("username");
40           
41           if ("xdclass".equals(username)) {
42               filterChain.doFilter(servletRequest,servletResponse);
43           } else {
44               resp.sendRedirect("/index.html");
45               return;
46           }
47           
48           
49 
50       }
51 
52       /**
53        * 容器被銷燬的時候被呼叫
54        */
55       @Override
56       public void destroy() {
57           System.out.println("destroy loginFilter");
58       }
59 
60 }

  controller:

瀏覽器輸入:http://localhost:8083/api/v1/account?username=xdclass

前臺顯示:

控制檯顯示:

輸入錯誤的username情況:

瀏覽器輸入:http://localhost:8083/api/v1/account?username=xdclasss

跳轉到index.html(可用於提示使用者進行登入操作)