一文詳解Java攔截器與過濾器的使用
流程圖
攔截器vs過濾器
攔截器是SpringMVC的技術(shù)
過濾器的Servlet的技術(shù)
先過過濾器,過濾器過完才到DispatcherServlet;
攔截器歸屬于SpringMVC,只可能攔SpringMVC的東西;
攔截器說白了就是為了增強,可以在請求前進行增強,也可以在請求后進行增強,但是不一定同時在前后都增強。
區(qū)別
SpringMVC技術(shù)架構(gòu)圖
項目Demo
依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.7.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
Interceptor攔截器
package com.test.filtertest.inter; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 攔截器 * * @author: zhangzengxiu * @createDate: 2022/4/22 */ @Component public class TestInter1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("TestInter1 preHandle..."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("TestInter1 postHandle..."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("TestInter1 afterCompletion..."); } }
Interceptor攔截器要注冊
package com.test.filtertest.config; import com.test.filtertest.inter.TestInter1; import com.test.filtertest.inter.TestInter2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @author zhangzengxiu * @date 2022/4/22 */ @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private TestInter1 testInter1; @Autowired private TestInter2 testInter2; @Override public void addInterceptors(InterceptorRegistry registry) { //默認/** 攔截所有請求 registry.addInterceptor(testInter1).addPathPatterns("/**"); registry.addInterceptor(testInter2); } }
攔截順序
多攔截器攔截順序取決于registry的注冊順序
Filter過濾器
1、多Filter不指定過濾順序
package com.test.filtertest.filter; import org.springframework.core.annotation.Order; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * @author zhangzengxiu * @date 2022/4/22 */ @WebFilter(filterName = "TestFilter1", urlPatterns = "/*") //@Order(2) //filter這樣定義攔截順序無效,還是會按照類名去攔截 public class TestFilter1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("TestFilter1 filter before ..."); filterChain.doFilter(servletRequest, servletResponse); System.out.println("TestFilter1 filter after ..."); } @Override public void destroy() { } }
加了@WebFilter注解的過濾器要生效,需要在啟動類上加一個注解@ServletComponentScan
2、多Filter指定過濾順序
如果要設(shè)置過濾順序的話,在Filter上添加@Order 不會生效,還是會默認根據(jù)Filter過濾器的類名去進行過濾。
如果想要指定攔截順序,需要添加一個配置類,通過設(shè)置Order的值去設(shè)置過濾順序,Order數(shù)值越小優(yōu)先級越高
package com.test.config; import com.test.filter.TestFilter1; import com.test.filter.TestFilter2; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; /** * filter過濾器配置 * * @author: zhangzengxiu * @createDate: 2022/4/24 */ @Configuration public class FilterConfig { @Bean public FilterRegistrationBean testFilter1() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); Filter testFilter1 = new TestFilter1(); filterRegistrationBean.setFilter(testFilter1); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setName("testFilter1"); filterRegistrationBean.setOrder(2);//指定過濾順序,數(shù)值越小優(yōu)先級越高 return filterRegistrationBean; } @Bean public FilterRegistrationBean testFilter2() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); Filter testFilter2 = new TestFilter2(); filterRegistrationBean.setFilter(testFilter2); filterRegistrationBean.setName("testFilter2"); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setOrder(1);//指定過濾順序,數(shù)值越小優(yōu)先級越高 return filterRegistrationBean; } }
1、同時原本Filter過濾器上的@WebFilter(filterName = “TestFilter1”, urlPatterns = “/*”)
這個注解最好去掉,否則bean重復(fù)會報錯,要么bean名稱不要重復(fù),換個名稱。但是不去掉的話@ServletComponentScan也要被保留,最好統(tǒng)一格式,只使用config配置。
2、啟動類上的@ServletComponentScan 注解也不需要了,可以去掉了,因為不用掃描@WebFilter注解了。但是如果@WebFilter還保留了,那么就不能去掉了。不然加了@WebFilter的過濾器就不會生效了,因為沒掃到。
到此這篇關(guān)于一文詳解Java攔截器與過濾器的使用的文章就介紹到這了,更多相關(guān)Java攔截器 過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java通過PropertyDescriptor反射調(diào)用set和get方法
這篇文章主要為大家詳細介紹了Java通過PropertyDescriptor反射調(diào)用set和get方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03Java實現(xiàn)并發(fā)執(zhí)行定時任務(wù)并手動控制開始結(jié)束
這篇文章主要介紹了Java實現(xiàn)并發(fā)執(zhí)行定時任務(wù)并手動控制開始結(jié)束,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報錯問題
本地倉庫是遠程倉庫的一個緩沖和子集,當(dāng)你構(gòu)建Maven項目時首先會從本地倉庫查找資源,如果沒有那么Maven會從遠程倉庫下載到你本地倉庫,這篇文章主要給大家介紹了關(guān)于maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報錯問題的相關(guān)資料,需要的朋友可以參考下2024-01-01SpringDataJpa如何使用union多表分頁條件查詢
這篇文章主要介紹了SpringDataJpa如何使用union多表分頁條件查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02java ExecutorService CompletionService線程池區(qū)別與選擇
這篇文章主要為大家介紹了java ExecutorService CompletionService線程池區(qū)別與選擇使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09