电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

解決springboot中配置過濾器以及可能出現的問題

瀏覽:41日期:2023-04-25 13:05:57

在springboot添加過濾器有兩種方式:

1、通過創建FilterRegistrationBean的方式(建議使用此種方式,統一管理,且通過注解的方式若不是本地調試,如果在filter中需要增加cookie可能會存在寫不進前端情況)

2、通過注解@WebFilter的方式

通過創建FilterRegistrationBean的方式創建多個filter以及設置執行順序:

1、創建兩個實現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、創建配置類

有多個filter就創建多個FilterRegistrationBean ,若需注明filter的執行順序,可通過registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1)配置,值越大,執行順序越靠后

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 * */@Configurationpublic class FilterConfig2 { @Bean public FilterRegistrationBean companyUrlFilterRegister() { FilterRegistrationBean registration = new FilterRegistrationBean(); //注入過濾器 registration.setFilter(new TestFilter1()); //攔截規則 registration.addUrlPatterns('/*'); //過濾器名稱 registration.setName('testFilter1'); //過濾器順序 registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); return registration; } @Bean public FilterRegistrationBean outLinkSecurityFilterRegister() { FilterRegistrationBean registration = new FilterRegistrationBean(); //注入過濾器 registration.setFilter(new TestFilter2()); //攔截規則 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 }}

注:經測試,@Order并不能實現過濾器排序功能,在springboot中注解的方式增加過濾器可通過修改過濾器文件名稱的方式排序,如上的過濾器TestFilter1在TestFilter2前。

補充知識:SpringBoot2.1.x,集成Filter過濾器的三種方式,包含OncePerRequestFilter方式

一)Filter過濾器簡介

主要作用:Filter使用戶可以改變一個request和修改一個response,它能夠在一個request到達servlet之前預處理request,也可以在response離開servlet時處理response。例如收集數據和包裝數據,并進行處理。

1、Filter是依賴Servlet容器的,如Tomcat。

2、Filter對所有的請求起作用,并是在sevlet之前處理。可以理解成過濾器中包含攔截器,當一個請求過來,先進行過濾器處理,再看程序是否受理該請求。過濾器執行完后,程序中的攔截器再進行處理。

3、Filter只能處理HttpServletRequest和HttpServletResponse,底層是基于回調函數。

二)SpringBoot集成Filter過濾器

第一步:先創建一個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

創建一個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 */@RestControllerpublic 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('=====>進入DemoController /demo/get/param'); return '/demo/get/param,' + param; }}

第二步:使用@WebFilter注解方式,實現Filter過濾器

當使用@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注解指定掃描包 * 方式二: 結合@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('====>進入OAuthFilter doFilterInternal過濾器===='); System.out.println('請求地址: ' + request.getRequestURL()); System.out.println('GET請求參數: '); Enumeration<String> parameters = request.getParameterNames(); String parameterName = ''; while (parameters.hasMoreElements()) { parameterName = parameters.nextElement(); System.out.println('參數名稱: ' + parameterName + ', 值: ' + request.getParameter(parameterName)); } // 工具類 //FilterConfig filterConfig = super.getFilterConfig(); //ServletContext servletContext = super.getServletContext(); //Environment environment = super.getEnvironment(); System.out.println('====>結束OAuthFilter doFilterInternal過濾器===='); filterChain.doFilter(request, response); }}

第三步:使用@Component注解方式,實現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 */@Componentpublic class PathFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 轉換 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; System.out.println('====>進入PathFilter doFilter過濾器===='); System.out.println('====>結束PathFilter doFilter過濾器===='); filterChain.doFilter(request, response); }}

第四步:通過@Bean注解方式,實現Filter過濾器

@Configuration注解:相當于spring中的<beans>標簽

@Bean注解:相當于spring中<bean>標簽

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注解: 相當于spring中的<beans>標簽 * @Bean注解: 相當于spring中<bean>標簽 * @author ouyangjun */@Configurationpublic 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'); // 設置filter名稱 registration.setOrder(1); // 請求中過濾器執行的先后順序,值越小越先執行 return registration; } // 實現一個過濾器 public class MyFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 轉換 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; System.out.println('====>進入MyFilter doFilter過濾器===='); System.out.println('====>結束MyFilter doFilter過濾器===='); filterChain.doFilter(request, response); } }}

第五步:創建一個SpringBoot啟動類,并通過@ServletComponentScan注解指定掃描的Filter實現類

package com.oysept; import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.web.servlet.ServletComponentScan; /** * @ServletComponentScan注解不指定掃描包時, 默認掃描當前包和子包 * @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

在控制臺查看打印日志:

解決springboot中配置過濾器以及可能出現的問題

項目結構圖:

解決springboot中配置過濾器以及可能出現的問題

以上這篇解決springboot中配置過濾器以及可能出現的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 南京和瑞包装有限公司| 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 振动传感器,检波器-威海广达勘探仪器有限公司| 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 合肥办公室装修 - 合肥工装公司 - 天思装饰 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 焊锡丝|焊锡条|无铅锡条|无铅锡丝|无铅焊锡线|低温锡膏-深圳市川崎锡业科技有限公司 | 流变仪-热分析联用仪-热膨胀仪厂家-耐驰科学仪器商贸 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 算命免费_生辰八字_免费在线算命 - 卜算子算命网 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 江苏皓越真空设备有限公司| 振动传感器,检波器-威海广达勘探仪器有限公司 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 禹城彩钢厂_钢结构板房_彩钢复合板-禹城泰瑞彩钢复合板加工厂 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 真空吸污车_高压清洗车厂家-程力专用汽车股份有限公司官网 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 |