Spring Boot之FilterRegistrationBean-自定義Filter詳解
Spring Boot之FilterRegistrationBean-自定義Filter
項目老的用spring寫的,新的升級到了springboot,原代碼中有在web.xml中定義過濾器,在boot中,自然沒法這樣用了,因而看了看boot如何使用自定義過濾器。
在springboot 中,主要是靠FilterRegistrationBean 這個類來提供這樣的功能。
自定義 Filter
我們常常在項目中會使用 filters 用于錄調(diào)用日志、排除有 XSS 威脅的字符、執(zhí)行權(quán)限驗證等等。Spring Boot 自動添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter,并且我們可以自定義 Filter。
兩個步驟:
- 1、實現(xiàn) Filter 接口,實現(xiàn) Filter 方法
- 2、添加 @Configuration 注解,將自定義Filter加入過濾鏈
好吧,直接上代碼
package com.zoo.lion.modules.test.test;
import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @Author: xf
* @Date: 2019/7/16 13:39
* @Version 1.0
*/
@Configuration
public class WebConfiguration {
@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter();
}
@Bean
public FilterRegistrationBean<MyFilter> testFilterRegistration() {
FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new MyFilter());
//過濾應(yīng)用程序中所有資源,當前應(yīng)用程序根下的所有文件包括多級子目錄下的所有文件,注意這里*前有“/”
registration.addUrlPatterns("/*");
//過濾指定的類型文件資源, 當前應(yīng)用程序根目錄下的所有html文件,注意:*.html前沒有“/”,否則錯誤
registration.addUrlPatterns(".html");
//過濾指定的目錄下的所有文件,當前應(yīng)用程序根目錄下的folder_name子目錄(可以是多級子目錄)下所有文件
registration.addUrlPatterns("/folder_name/*");
//過濾指定文件
registration.addUrlPatterns("/index.html");
registration.addInitParameter("paramName", "paramValue");
registration.setName("MyFilter");
registration.setOrder(1);
return registration;
}
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request2 = (HttpServletRequest) request;
System.out.println(request2.getRequestURI());
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
}
SpringBoot FilterRegistrationBean對象支持web的filter的排序
1.FilterRegistrationBean對象可以實現(xiàn)對web Filter的排序,使用setOrder(int i)方法
具體代碼如下:
package com.dbzhang;
/**
* @author zdb
* @description @Configuration和@Bean注解配置使用,就相當于在配置文件中配置bean的注解式用法
*/
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebConfiguration {
@Bean
public RemoteIpFilter remoteIpFilter(){
return new RemoteIpFilter();
}
/***
* 這個FilterRegistrationBean類可以使用setOrder()方法實現(xiàn)對filter的排序,然后在進行注冊
* https://blog.csdn.net/doctor_who2004/article/details/56055505
*/
public FilterRegistrationBean testFilterRegistration(){
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("MyFilter");
registration.setOrder(1);
return registration;
}
/**
*
* @author zdb
* @description 這個是用來實現(xiàn)Filter
*
*/
public class MyFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
System.out.println("this is MyFilter,url:"+request.getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)開發(fā)輔助工具Docker與普通程序使用方法
這是為數(shù)據(jù)開發(fā)人員使用的輔助工具,用于數(shù)據(jù)庫之間的表同步,說同步并不嚴謹,因為不是實時更新的,更確切的說法是復(fù)制,可以方便的從一個數(shù)據(jù)庫復(fù)制表到另一個數(shù)據(jù)庫,以下遇到同步的詞請理解為復(fù)制2021-09-09
Java8?CompletableFuture?runAsync學(xué)習(xí)總結(jié)submit()?execute()等
這篇文章主要介紹了Java8?CompletableFuture?runAsync學(xué)習(xí)總結(jié)submit()?execute()等,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
Struts2源碼分析之ParametersInterceptor攔截器
這篇文章主要介紹了Struts2源碼分析之ParametersInterceptor攔截器,ParametersInterceptor攔截器其主要功能是把ActionContext中的請求參數(shù)設(shè)置到ValueStack中,,需要的朋友可以參考下2019-06-06
JAVA多線程實現(xiàn)生產(chǎn)者消費者的實例詳解
這篇文章主要介紹了JAVA多線程實現(xiàn)生產(chǎn)者消費者的實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
SpringBoot中的yml文件中讀取自定義配置信息及遇到問題小結(jié)
這篇文章主要介紹了SpringBoot中的yml文件中讀取自定義配置信息,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
java中兩個字符串的拼接、整數(shù)相加和浮點數(shù)相加實現(xiàn)代碼
這篇文章主要為大家介紹java中從鍵盤讀取用戶輸入兩個字符串,實現(xiàn)這兩個字符串的拼接、整數(shù)相加和浮點數(shù)相加,并輸出結(jié)果,需要的朋友可以參考下2021-05-05

