解決springboot中配置過濾器以及可能出現(xiàn)的問題
在springboot添加過濾器有兩種方式:
1、通過創(chuàng)建FilterRegistrationBean的方式(建議使用此種方式,統(tǒng)一管理,且通過注解的方式若不是本地調(diào)試,如果在filter中需要增加cookie可能會存在寫不進(jìn)前端情況)
2、通過注解@WebFilter的方式
通過創(chuàng)建FilterRegistrationBean的方式創(chuàng)建多個filter以及設(shè)置執(zhí)行順序:
1、創(chuàng)建兩個實現(xiàn)Filter接口的類TestFilter1 、TestFilter2
package com.aoxun.core.filter;
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;
public class TestFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
package com.aoxun.core.filter;
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;
public class TestFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
2、創(chuàng)建配置類
有多個filter就創(chuàng)建多個FilterRegistrationBean ,若需注明filter的執(zhí)行順序,可通過registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1)配置,值越大,執(zhí)行順序越靠后
package com.aoxun.config.web;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.aoxun.core.filter.TestFilter1;
import com.aoxun.core.filter.TestFilter2;
/**
* filter配置
* @author zcj
*
*/
@Configuration
public class FilterConfig2 {
@Bean
public FilterRegistrationBean companyUrlFilterRegister() {
FilterRegistrationBean registration = new FilterRegistrationBean();
//注入過濾器
registration.setFilter(new TestFilter1());
//攔截規(guī)則
registration.addUrlPatterns("/*");
//過濾器名稱
registration.setName("testFilter1");
//過濾器順序
registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
return registration;
}
@Bean
public FilterRegistrationBean outLinkSecurityFilterRegister() {
FilterRegistrationBean registration = new FilterRegistrationBean();
//注入過濾器
registration.setFilter(new TestFilter2());
//攔截規(guī)則
registration.addUrlPatterns("/*");
//過濾器名稱
registration.setName("testFilter2");
//過濾器順序
registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1);
return registration;
}
}
通過注解@WebFilter的方式
1、在啟動類上增加@ServletComponentScan注解,自動掃描帶有過濾器注解的包
2、在類上使用@WebFilter
package com.aoxun.core.filter;
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.annotation.WebFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.core.annotation.Order;
@WebFilter(filterName="testFilter1",urlPatterns= {"/*"})
public class TestFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
注:經(jīng)測試,@Order并不能實現(xiàn)過濾器排序功能,在springboot中注解的方式增加過濾器可通過修改過濾器文件名稱的方式排序,如上的過濾器TestFilter1在TestFilter2前。
補充知識:SpringBoot2.1.x,集成Filter過濾器的三種方式,包含OncePerRequestFilter方式
一)Filter過濾器簡介
主要作用:Filter使用戶可以改變一個request和修改一個response,它能夠在一個request到達(dá)servlet之前預(yù)處理request,也可以在response離開servlet時處理response。例如收集數(shù)據(jù)和包裝數(shù)據(jù),并進(jìn)行處理。
1、Filter是依賴Servlet容器的,如Tomcat。
2、Filter對所有的請求起作用,并是在sevlet之前處理??梢岳斫獬蛇^濾器中包含攔截器,當(dāng)一個請求過來,先進(jìn)行過濾器處理,再看程序是否受理該請求。過濾器執(zhí)行完后,程序中的攔截器再進(jìn)行處理。
3、Filter只能處理HttpServletRequest和HttpServletResponse,底層是基于回調(diào)函數(shù)。
二)SpringBoot集成Filter過濾器
第一步:先創(chuàng)建一個maven項目,引入springboot的jar
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.oysept</groupId>
<artifactId>springboot_filter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.oysept.FilterApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
添加一個application.yml配置文件,指定一個端口
server:
port: 8080
創(chuàng)建一個Demo測試接口
package com.oysept.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Demo Controller
* @author ouyangjun
*/
@RestController
public class DemoController {
// 帶參GET請求: http://localhost:8080/demo/get/param?param=111222333444
@RequestMapping(value = "/demo/get/param", method = RequestMethod.GET)
public String getParam(@RequestParam(value = "param") String param) {
System.out.println("=====>進(jìn)入DemoController /demo/get/param");
return "/demo/get/param," + param;
}
}
第二步:使用@WebFilter注解方式,實現(xiàn)Filter過濾器
當(dāng)使用@WebFilter、@WebServlet、@WebListener等注解時, 需要在springboot啟動類中啟用@ServletComponentScan注解指定掃描包。
package com.oysept.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.env.Environment;
import org.springframework.web.filter.OncePerRequestFilter;
/**
* 過濾器, 過濾所有地址
* 方式一: 使用@WebFilter、@WebServlet、@WebListener等注解時, 需要在springboot啟動類中啟用@ServletComponentScan注解指定掃描包
* 方式二: 結(jié)合@WebFilter和@Component注解一起使用, 但可能會同時注入兩個bean, 可能會報錯, 可在application.yml配置中啟用同名Bean覆蓋: spring.main.allow-bean-definition-overriding=true
* @author ouyangjun
*/
@WebFilter(value = "/*", filterName = "oauthFilter")
public class OAuthFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
System.out.println("====>進(jìn)入OAuthFilter doFilterInternal過濾器====");
System.out.println("請求地址: " + request.getRequestURL());
System.out.println("GET請求參數(shù): ");
Enumeration<String> parameters = request.getParameterNames();
String parameterName = "";
while (parameters.hasMoreElements()) {
parameterName = parameters.nextElement();
System.out.println("參數(shù)名稱: " + parameterName + ", 值: " + request.getParameter(parameterName));
}
// 工具類
//FilterConfig filterConfig = super.getFilterConfig();
//ServletContext servletContext = super.getServletContext();
//Environment environment = super.getEnvironment();
System.out.println("====>結(jié)束OAuthFilter doFilterInternal過濾器====");
filterChain.doFilter(request, response);
}
}
第三步:使用@Component注解方式,實現(xiàn)Filter過濾器
package com.oysept.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
/**
* 過濾器通過@Component注解注冊
* @author ouyangjun
*/
@Component
public class PathFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// 轉(zhuǎn)換
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
System.out.println("====>進(jìn)入PathFilter doFilter過濾器====");
System.out.println("====>結(jié)束PathFilter doFilter過濾器====");
filterChain.doFilter(request, response);
}
}
第四步:通過@Bean注解方式,實現(xiàn)Filter過濾器
@Configuration注解:相當(dāng)于spring中的<beans>標(biāo)簽
@Bean注解:相當(dāng)于spring中<bean>標(biāo)簽
package com.oysept.config;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Configuration注解: 相當(dāng)于spring中的<beans>標(biāo)簽
* @Bean注解: 相當(dāng)于spring中<bean>標(biāo)簽
* @author ouyangjun
*/
@Configuration
public class MyFilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> testFilterRegistration() {
FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*"); // 配置過濾路徑
registration.addInitParameter("paramName", "paramValue"); // 添加初始值
registration.setName("myFilter"); // 設(shè)置filter名稱
registration.setOrder(1); // 請求中過濾器執(zhí)行的先后順序,值越小越先執(zhí)行
return registration;
}
// 實現(xiàn)一個過濾器
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// 轉(zhuǎn)換
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
System.out.println("====>進(jìn)入MyFilter doFilter過濾器====");
System.out.println("====>結(jié)束MyFilter doFilter過濾器====");
filterChain.doFilter(request, response);
}
}
}
第五步:創(chuàng)建一個SpringBoot啟動類,并通過@ServletComponentScan注解指定掃描的Filter實現(xiàn)類
package com.oysept;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
/**
* @ServletComponentScan注解不指定掃描包時, 默認(rèn)掃描當(dāng)前包和子包
* @author ouyangjun
*/
@SpringBootApplication
@ServletComponentScan(basePackages = "com.oysept.filter")
public class FilterApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FilterApplication.class).run(args);
}
}
啟動main方法,在瀏覽器輸入地址:http://localhost:8080/demo/get/param?param=111222333444
在控制臺查看打印日志:

項目結(jié)構(gòu)圖:

以上這篇解決springboot中配置過濾器以及可能出現(xiàn)的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別
- SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法
- springboot基于過濾器實現(xiàn)接口請求耗時統(tǒng)計操作
- springboot @WebFilter注解過濾器的實現(xiàn)
- Springboot過濾器禁止ip頻繁訪問功能實現(xiàn)
- SpringBoot實現(xiàn)過濾器、攔截器與切片的實現(xiàn)和區(qū)別
- 手把手教你SpringBoot過濾器N種注冊方式
- springboot 增加過濾器方法操作示例
- 簡單了解SpringBoot過濾器及使用方式
- springboot自定義過濾器的方法
相關(guān)文章
Spring Boot集成Swagger2項目實戰(zhàn)
在日常的工作中,我們往往需要給前端(WEB端、IOS、Android)或者第三方提供接口,這個時候我們就需要給他們提供一份詳細(xì)的API說明文檔。這篇文章我們就來分享一種API文檔維護(hù)的方式,即通過Swagger來自動生成Restuful API文檔2018-01-01
使用EasyPoi完成復(fù)雜一對多excel表格導(dǎo)出功能全過程
這篇文章主要介紹了使用EasyPoi完成復(fù)雜一對多excel表格導(dǎo)出功能全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
服務(wù)器實現(xiàn)Java遠(yuǎn)程訪問Linux服務(wù)器方式(JSch)
文章介紹了如何使用Java遠(yuǎn)程訪問Linux服務(wù)器,主要包括建立SSH連接、使用JSch庫執(zhí)行命令、解析返回值以及關(guān)閉連接的步驟2024-11-11

