SpringBoot(十一)過濾器和攔截器
在做web開發的時候,過濾器(Filter)和攔截器(Interceptor)很常見,通俗的講,過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感詞彙。
過濾器依賴於servlet容器,是JavaEE標準,是在請求進入容器之後,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行後期處理。在實現上基於函式回撥,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器例項只能在容器初始化時呼叫一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的資料,比如:在過濾器中修改字元編碼;在過濾器中修改HttpServletRequest的一些引數,包括:過濾低俗文字、危險字元等
java裡的攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。
v過濾器demo
1.1 建立MyTestFilter
package com.demo.Filter; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * Created by toutou on 2018/10/27. */ @Slf4j @Component
public class MyTestFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throwsServletException { System.out.println("1111111111111111111111111"); log.info("filter 初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("2222222222222222222222222"); log.info("doFilter 請求處理"); //TODO 進行業務邏輯 //鏈路 直接傳給下一個過濾器 chain.doFilter(request, response); } @Override public void destroy() { System.out.println("33333333333333333333333333"); log.info("filter 銷燬"); } }
1.2 檢視idea啟動日誌
1.3 啟動tomcat,檢視日誌。
如果需要針對指定路徑才讓過濾器生效,可以參考WebConfig
類。
v攔截器demo
2.1 MyTestInterceptor
package com.demo.Filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * Created by toutou on 2018/10/27. */ @Component public class MyTestInterceptor implements HandlerInterceptor { /* * 檢視渲染之後的操作 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } /* * 處理請求完成後檢視渲染之前的處理操作 */ @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } /* * 進入controller層之前攔截請求 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { System.out.println("MyTestInterceptor 1111111111"); return true; } }
2.2 WebConfig
package com.demo.Filter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; /** * Created by toutou on 2018/10/27. */ @Configuration public class WebConfig implements WebMvcConfigurer { @Resource private MyTestInterceptor myTestInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 自定義攔截器,新增攔截路徑和排除攔截路徑 registry.addInterceptor(myTestInterceptor).addPathPatterns("/show"); } @Bean public FilterRegistrationBean testFilterRegistration(MyTestFilter myTestFilter) { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(myTestFilter);//新增過濾器 registration.addUrlPatterns("/show");//設定過濾路徑,/*所有路徑 //registration.addInitParameter("name", "alue");//新增預設引數 registration.setName("MyFilter");//設定優先順序 registration.setOrder(1);//設定優先順序 return registration; } }
執行效果:
v注意事項
注意設定啟動類的掃描路徑。
package com.demo.hellospringboot; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = {"com.demo"}) @MapperScan(basePackages = {"com.demo.dao"}) @Slf4j public class HellospringbootApplication { public static void main(String[] args) { SpringApplication.run(HellospringbootApplication.class, args); } }
作 者:請叫我頭頭哥
出 處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!