實(shí)現(xiàn)Filter的幾種方法
問題點(diǎn):如何應(yīng)用過濾器?實(shí)現(xiàn)過濾器有哪些方法?
過濾器的作用:在javaweb的中過濾器的主要作用是過濾指定路徑格式的接口,在請(qǐng)求前后做處理,既可以更改請(qǐng)求頭也可以更改請(qǐng)求的返回值。
應(yīng)用場(chǎng)景:改變請(qǐng)求頭信息、添加新的請(qǐng)求頭內(nèi)容、判斷來自客戶端的內(nèi)容是否存在非法信息等等!
實(shí)現(xiàn)過濾器的幾種常見的方式:
// 實(shí)現(xiàn)Filter接口
@Component // 通過Component注解讓Spring容器自動(dòng)為我們創(chuàng)建實(shí)例
public class MyFilter implements Filter {
// 銷毀過濾器時(shí)調(diào)用的方法(默認(rèn)不用實(shí)現(xiàn))
@Override
public void destroy() {
Filter.super.destroy();
}
// 初始化方法(默認(rèn)不用實(shí)現(xiàn)該方法)
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 請(qǐng)求接口前操作
// 調(diào)用接口方法前需要執(zhí)行的代碼
filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個(gè)過濾器
// 請(qǐng)求接口后操作
// 調(diào)用接口方法后需要執(zhí)行的代碼
}
}
上述方式一的實(shí)現(xiàn)比較簡(jiǎn)單,但是這種方式有一個(gè)缺陷(漏洞);大家請(qǐng)注意上面的過濾器對(duì)象是由注解自動(dòng)配置并創(chuàng)建的,這樣就是默認(rèn)值**“/*”**,所以過濾范圍是所有接口。
基于方式一的漏洞問題做了如下的改動(dòng):
// 實(shí)現(xiàn)Filter接口
public class MyFilter implements Filter {
// 銷毀過濾器時(shí)調(diào)用的方法(默認(rèn)不用實(shí)現(xiàn))
@Override

public void destroy() {
Filter.super.destroy();
}
// 初始化方法(默認(rèn)不用實(shí)現(xiàn)該方法)
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 請(qǐng)求接口前操作
// 調(diào)用接口方法前需要執(zhí)行的代碼
filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個(gè)過濾器
// 請(qǐng)求接口后操作
// 調(diào)用接口方法后需要執(zhí)行的代碼
}
}
上述的實(shí)現(xiàn)與方式一基本相同,唯一不同的地方就是沒有通過@注解進(jìn)行注入容器。
配置過濾器通過@Bean的方式:
@Configuration
public class MyFilterRegistration {
@Bean
public FilterRegistrationBean<MyFilter> registrationBean(){
// 創(chuàng)建FilterRegistrationBean,通過它配置過濾器
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter()); // 設(shè)置過濾器
registrationBean.addUrlPatterns("/device/*"); // 設(shè)置過濾器生效范圍
registrationBean.setName("myFilter"); // 過濾器名稱
registrationBean.setOrder(1); // 設(shè)置優(yōu)先級(jí)
return registrationBean;
}
}
方式二是實(shí)現(xiàn)Filter接口,并通過自定義配置類的方式將自定義的Filter實(shí)現(xiàn)注入到Spring容器。
通過@注解實(shí)現(xiàn):
// 實(shí)現(xiàn)Filter接口,通過WebFilter可以配置過濾范圍、name等參數(shù)
@WebFilter(value = "/device/*",filterName = "myFilter",displayName = "thisIsFilter")
public class MyFilter implements Filter {
// 銷毀過濾器時(shí)調(diào)用的方法(默認(rèn)不用實(shí)現(xiàn))
@Override
public void destroy() {
Filter.super.destroy();
}
// 初始化方法(默認(rèn)不用實(shí)現(xiàn)該方法)
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 請(qǐng)求接口前操作
// 調(diào)用接口方法前需要執(zhí)行的代碼
filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個(gè)過濾器
// 請(qǐng)求接口后操作
// 調(diào)用接口方法后需要執(zhí)行的代碼
}
}
注意點(diǎn):通過@實(shí)現(xiàn)的時(shí)候還需要做一件事,否則@不生效;
@ServletComponentScan // 如果不標(biāo)準(zhǔn)該注解方式三將不會(huì)生效
public class DisplayCoreApplication {
public static void main(String[] args) {
SpringApplication.run(DisplayCoreApplication.class, args);
}
}
總結(jié):以上就是幾種實(shí)現(xiàn)過濾器的方式,個(gè)人比較推薦方式二,因?yàn)檫@樣可以將所有的自定義過濾器統(tǒng)一通過一個(gè)配置類注入到容器,后期查看時(shí)也是一目了然!當(dāng)然方式三更加的簡(jiǎn)潔,視情況而定吧。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。