知識點:
1、SpringBoot2.x過濾器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
a)使用Servlet3.0的注解進行配置
b)啟動類里面增加 @ServletComponentScan,進行掃描
c)新建一個Filter類,implements Filter,並實現對應的接口
d) @WebFilter 標記一個類為filter,被spring進行掃描
urlPatterns:攔截規則,支持正則
e)控制chain.doFilter的方法的調用,來實現是否通過放行
不放行,web應用resp.sendRedirect("/index.html");
場景:權限控制、用戶登錄(非前端后端分離場景)等
4)官網地址: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實戰
講解:使用 Servlet3.0的注解自定義原生Servlet和Listener
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監聽器實戰
簡介:監聽器介紹和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自定義攔截器實戰及新舊配置對比(核心知識)
簡介: 講解攔截器使用,Spingboot2.x新版本配置攔截攔截器和舊版本SpringBoot配置攔截器區別講解
1) @Configuration
繼承WebMvcConfigurationAdapter(SpringBoot2.X之前舊版本)
SpringBoot2.X 新版本配置攔截器 implements WebMvcConfigurer
2) 自定義攔截器 HandlerInterceptor
preHandle:調用Controller某個方法之前
postHandle:Controller之后調用,視圖渲染之前,如果控制器Controller出現了異常,則不會執行此方法
afterCompletion:不管有沒有異常,這個afterCompletion都會被調用,用於資源清理
3) 按照注冊順序進行攔截,先注冊,先被攔截
攔截器不生效常見問題:
a)是否有加@Configuration
b)攔截路徑是否有問題 ** 和 *
c)攔截器最后路徑一定要 “/**”, 如果是目錄的話則是 /*/
Filter
是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
Filter在只在Servlet前后起作用,而Interceptor夠深入到方法前后、異常拋出前后等
依賴於Servlet容器即web應用中,而Interceptor不依賴於Servlet容器所以可以運行在多種環境。
在接口調用的生命周期里,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。
Filter和Interceptor的執行順序
過濾前->攔截前->action執行->攔截后->過濾后
過濾器、攔截器、監聽器的區別:
1、過濾器
過濾器是在請求進入tomcat容器后,但請求進入servlet之前進行預處理的。請求結束返回也是,是在servlet處理完后,返回給前端之前。
理解上面這句話我們就可以知道,進入servlet之前,主要是兩個參數:ServletRequest,ServletResponse 那我們得到這兩個測試可以干哪些事呢?
我們可以通過ServletRequest得到HttpServletRequest,此時你就可以對請求或響應(Request、Response)那就可以對對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息、字符集統一等一些高級功能。它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行后處理。使用Filter的完整流程:Filter對用戶請求進行預處理,接着將請求交給Servlet進行處理並生成響應,最后Filter再對服務器響應進行后處理。。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。(每次熱部署后,都會銷毀)。
2、攔截器
從上圖我們可以看出過濾器只在servlet前后起作用,所以它既不能捕獲異常,獲得bean對象等,這些是只能是進入servlet里面的攔截器能過做到。攔截器中用於在某個方法或字段被訪問之前,進行攔截然后,在之前或之后加入某些操作。比如日志,安全等。一般攔截器方法都是通過動態代理的方式實現。可以通過它來進行權限驗證,或者判斷用戶是否登陸,或者是像12306 判斷當前時間是否是購票時間。
對比一下其實我們可以發現,過濾器能做的事攔截器都能做,二攔截器做的事過濾器不一定做的了。
3、監聽器
listener是servlet規范中定義的一種特殊類。用於監聽servletContext、HttpSession和servletRequest等域對象的創建和銷毀事件。監聽域對象的屬性發生修改的事件。用於在事件發生前、發生后做一些必要的處理。其主要可用於以下方面:1、統計在線人數和在線用戶2、系統啟動時加載初始化信息3、統計網站訪問量4、記錄用戶訪問路徑。
常用的監聽器 servletContextListener、httpSessionListener、servletRequestListener)
過濾器和攔截器的區別示意圖:
請求鏈路說明:
總結:
過濾器:用於屬性甄別,對象收集(不可改變過濾對象的屬性和行為)
監聽器:用於對象監聽,行為記錄(不可改變監聽對象的屬性和行為)
攔截器:用於對象攔截,行為干預(可以改變攔截對象的屬性和行為)
如何創建:
1、過濾器
自定義Filter 使用Servlet3.0的注解進行配置第三步的@WebFilter就是3.0的注解
1)啟動類里面增加 @ServletComponentScan,進行掃描
2)新建一個Filter類,implements Filter,並實現對應的接口
3) @WebFilter 標記一個類為filter,被spring進行掃描
urlPatterns:攔截規則,支持正則
4)控制chain.doFilter的方法的調用,來實現是否通過放行不放行,web應用resp.sendRedirect("/index.html");場景:權限控制、用戶登錄(非前端后端分離場景)等
application類
官網地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners
2、監聽器
3、攔截器
CustomWebMvcConfigurer主攔截器需要:
1)、添加@Configuration注解
2)、實現WebMvcConfigurer接口
原文:https://blog.csdn.net/yudiandemingzi/article/details/80399971