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

深入SpringBoot過濾器和Servlet3.0配置過濾器

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

Servlet3.0的註解原生Servlet實戰

使用 Servlet3.0的註解自定義原生Servlet和Listener

  • 自定義原生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);
		     }
		}

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========");
			
		}

SpringBoot2.X攔截器實戰及新舊配置對比

攔截器使用,Spingboot2.x新版本配置攔截攔截器和舊版本SpringBoot配置攔截器區別

1、@Configuration
	繼承WebMvcConfigurationAdapter(SpringBoot2.X之前舊版本)

	SpringBoot2.X 新版本配置攔截器 implements WebMvcConfigurer

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

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

攔截器不生效常見問題:
	1)是否有加@Configuration
	2)攔截路徑是否有問題 **  和 * 
	3)攔截器最後路徑一定要 “/**”, 如果是目錄的話則是 /*/

Filter
	是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
	Filter在只在Servlet前後起作用,而Interceptor夠深入到方法前後、異常拋出前後等

	依賴於Servlet容器即web應用中,而Interceptor不依賴於Servlet容器所以可以運行在多種環境。

	在接口調用的生命週期裏,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。
	
	Filter和Interceptor的執行順序
 	
	過濾前->攔截前->action執行->攔截後->過濾後

在這裏插入圖片描述
公衆號: 自學it的攻城獅(id:study458)

發佈了59 篇原創文章 · 獲贊 4 · 訪問量 5125
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章