一文詳解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)文章
使用lombok注解導(dǎo)致mybatis-plus TypeHandler失效的解決
這篇文章主要介紹了使用lombok注解導(dǎo)致mybatis-plus TypeHandler失效的解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
基于JavaSwing+mysql開發(fā)一個學生社團管理系統(tǒng)設(shè)計和實現(xiàn)
項目使用Java swing+mysql開發(fā),可實現(xiàn)基礎(chǔ)數(shù)據(jù)維護、用戶登錄注冊、社團信息列表查看、社團信息添加、社團信息修改、社團信息刪除以及退出注銷等功能、界面設(shè)計比較簡單易學、適合作為Java課設(shè)設(shè)計以及學習技術(shù)使用,需要的朋友參考下吧2021-08-08
Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例
這篇文章主要介紹了Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例,優(yōu)先級隊列中的元素會被設(shè)置優(yōu)先權(quán),本文的例子借助了Java中的TreeSet和TreeMap,需要的朋友可以參考下2016-04-04

