SpringBoot 過濾器 Filter使用實例詳解
簡介
過濾器是AOP(面向切面編程)思想的具體實現(xiàn)??梢赃^濾瀏覽器發(fā)出的請求,并且決定放行請求還是中斷請求。
在瀏覽器對服務(wù)器發(fā)起請求或者服務(wù)器對瀏覽器響應(yīng),都會經(jīng)過過濾器。
基于過濾器的機制,我們可以在過濾器中對請求和響應(yīng)做一些處理,可以在過濾器中決定是否放行,例如:校驗請求中有沒有敏感字符串,校驗有沒有Session,實現(xiàn)URL級別的權(quán)限控制、壓縮響應(yīng)信息、編碼格式等。
用法
在spring的應(yīng)用中我們存在兩種過濾的用法,一種是攔截器、另外一種當然是過濾器。我們這里介紹過濾器在springboot的用法,在springmvc中的用法基本上一樣,只是配置上面有點區(qū)別。
功能
filter功能,它使用戶可以改變一個 request和修改一個response. Filter 不是一個servlet,它不能產(chǎn)生一個response,它能夠在一個request到達servlet之前預(yù)處理request,也可以在離開 servlet時處理response.換種說法,filter其實是一個”servlet chaining”(servlet 鏈).
Filter接口中有一個doFilter方法,當開發(fā)人員編寫好Filter類實現(xiàn)doFilter方法,并配置對哪個web資源進行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對資源的訪問機制決定的),都會先調(diào)用一下filter的doFilter方法。
實現(xiàn)
Filter的執(zhí)行由Servlet容器回調(diào)完成,因此我們不需要再額外引包。
新建MyFilter類
@Slf4j @Order(1) @WebFilter(filterName = "myFilter", urlPatterns = {"/user/*"}) public class MyFilter implements Filter { @Autowired private SysUserService sysUserService; @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("過濾器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("請求處理"); HttpServletResponse response = (HttpServletResponse) servletResponse; HttpServletRequest request = (HttpServletRequest) servletRequest; log.info("MyFilter, URL:{}", request.getRequestURI()); if (request.getRequestURI().contains("login")) { filterChain.doFilter(servletRequest, servletResponse); } else { log.info("非法URL:{}", request.getRequestURI()); response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); PrintWriter writer = response.getWriter(); writer.print("no access"); } } @Override public void destroy() { log.info("過濾器銷毀"); } }
用@WebFilter注解,指定攔截路徑以及一些參數(shù),同時需要在啟動類使用@ServletComponentScan掃描帶@WebFilter、@WebServlet、@WebListener并將幫我們注入bean
@ServletComponentScan @SpringBootApplication public class DevRootApplication { public static void main(String[] args) { SpringApplication.run(DevRootApplication.class, args); } }
當有多個過濾器之后,就需要規(guī)定各個過濾器的指定順序了。
使用@Order()注解
以上就是SpringBoot 過濾器 Filter使用實例詳解的詳細內(nèi)容,更多關(guān)于SpringBoot Filter過濾器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合Hibernate Validator實現(xiàn)參數(shù)驗證功能
這篇文章主要介紹了SpringBoot整合Hibernate Validator實現(xiàn)參數(shù)驗證功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06詳解Java中的println輸入和toString方法的重寫問題
這篇文章主要介紹了Java中的println輸入和toString方法的重寫,一個對象數(shù)組在調(diào)用Arrays.toString打印時,相當于遍歷數(shù)組,然后打印里邊每個對象,這再打印對象就調(diào)用對象自己的toString了,需要的朋友可以參考下2022-04-04使用ShardingSphere-Proxy實現(xiàn)分表分庫
這篇文章介紹了使用ShardingSphere-Proxy實現(xiàn)分表分庫的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02詳解Java使用Jsch與sftp服務(wù)器實現(xiàn)ssh免密登錄
這篇文章主要介紹了詳解Java使用Jsch與sftp服務(wù)器實現(xiàn)ssh免密登錄,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10