解決springboot中配置過濾器以及可能出現(xiàn)的問題
在springboot添加過濾器有兩種方式:
1、通過創(chuàng)建FilterRegistrationBean的方式(建議使用此種方式,統(tǒng)一管理,且通過注解的方式若不是本地調(diào)試,如果在filter中需要增加cookie可能會(huì)存在寫不進(jìn)前端情況)
2、通過注解@WebFilter的方式
通過創(chuàng)建FilterRegistrationBean的方式創(chuàng)建多個(gè)filter以及設(shè)置執(zhí)行順序:
1、創(chuàng)建兩個(gè)實(shí)現(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)建配置類
有多個(gè)filter就創(chuàng)建多個(gè)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、在啟動(dòng)類上增加@ServletComponentScan注解,自動(dòng)掃描帶有過濾器注解的包
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)測(cè)試,@Order并不能實(shí)現(xiàn)過濾器排序功能,在springboot中注解的方式增加過濾器可通過修改過濾器文件名稱的方式排序,如上的過濾器TestFilter1在TestFilter2前。
補(bǔ)充知識(shí):SpringBoot2.1.x,集成Filter過濾器的三種方式,包含OncePerRequestFilter方式
一)Filter過濾器簡(jiǎn)介
主要作用:Filter使用戶可以改變一個(gè)request和修改一個(gè)response,它能夠在一個(gè)request到達(dá)servlet之前預(yù)處理request,也可以在response離開servlet時(shí)處理response。例如收集數(shù)據(jù)和包裝數(shù)據(jù),并進(jìn)行處理。
1、Filter是依賴Servlet容器的,如Tomcat。
2、Filter對(duì)所有的請(qǐng)求起作用,并是在sevlet之前處理??梢岳斫獬蛇^濾器中包含攔截器,當(dāng)一個(gè)請(qǐng)求過來,先進(jìn)行過濾器處理,再看程序是否受理該請(qǐng)求。過濾器執(zhí)行完后,程序中的攔截器再進(jìn)行處理。
3、Filter只能處理HttpServletRequest和HttpServletResponse,底層是基于回調(diào)函數(shù)。
二)SpringBoot集成Filter過濾器
第一步:先創(chuàng)建一個(gè)maven項(xiàng)目,引入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>
添加一個(gè)application.yml配置文件,指定一個(gè)端口
server:
port: 8080
創(chuàng)建一個(gè)Demo測(cè)試接口
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請(qǐng)求: 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注解方式,實(shí)現(xiàn)Filter過濾器
當(dāng)使用@WebFilter、@WebServlet、@WebListener等注解時(shí), 需要在springboot啟動(dòng)類中啟用@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等注解時(shí), 需要在springboot啟動(dòng)類中啟用@ServletComponentScan注解指定掃描包 * 方式二: 結(jié)合@WebFilter和@Component注解一起使用, 但可能會(huì)同時(shí)注入兩個(gè)bean, 可能會(huì)報(bào)錯(cuò), 可在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("請(qǐng)求地址: " + request.getRequestURL()); System.out.println("GET請(qǐng)求參數(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注解方式,實(shí)現(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注解注冊(cè) * @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注解方式,實(shí)現(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); // 請(qǐng)求中過濾器執(zhí)行的先后順序,值越小越先執(zhí)行 return registration; } // 實(shí)現(xiàn)一個(gè)過濾器 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)建一個(gè)SpringBoot啟動(dòng)類,并通過@ServletComponentScan注解指定掃描的Filter實(shí)現(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注解不指定掃描包時(shí), 默認(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); } }
啟動(dòng)main方法,在瀏覽器輸入地址:http://localhost:8080/demo/get/param?param=111222333444
在控制臺(tái)查看打印日志:
項(xiàng)目結(jié)構(gòu)圖:
以上這篇解決springboot中配置過濾器以及可能出現(xiàn)的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 詳談springboot過濾器和攔截器的實(shí)現(xiàn)及區(qū)別
- SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法
- springboot基于過濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作
- springboot @WebFilter注解過濾器的實(shí)現(xiàn)
- Springboot過濾器禁止ip頻繁訪問功能實(shí)現(xiàn)
- SpringBoot實(shí)現(xiàn)過濾器、攔截器與切片的實(shí)現(xiàn)和區(qū)別
- 手把手教你SpringBoot過濾器N種注冊(cè)方式
- springboot 增加過濾器方法操作示例
- 簡(jiǎn)單了解SpringBoot過濾器及使用方式
- springboot自定義過濾器的方法
相關(guān)文章
Java并發(fā)編程包中atomic的實(shí)現(xiàn)原理示例詳解
這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程包中atomic的實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09關(guān)于MD5算法原理與常用實(shí)現(xiàn)方式
這篇文章主要介紹了關(guān)于MD5算法原理與常用實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
這篇文章主要介紹了詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼
本篇文章主要介紹了消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接
這篇文章主要為大家詳細(xì)介紹了Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06