@WebFilter在SpringBoot無效的原因分析和解決方案
問題描述:
使用Ruoyi的demo部署成功后,發(fā)現(xiàn)js、css等靜態(tài)文件都進(jìn)入了過濾器,修改application.yml:
xss: # 過濾開關(guān) enabled: true # 排除鏈接(多個(gè)用逗號(hào)分隔) # 手動(dòng)增加.*\\.css,.*\\.jpg,.*\\.js,.*\\.map,注意使用的是正則表達(dá)式 excludes: /system/notice/*,.*\\.css,.*\\.jpg,.*\\.js,.*\\.map # 匹配鏈接 urlPatterns: /system/*,/monitor/*,/tool/*
自動(dòng)重啟應(yīng)用后發(fā)現(xiàn)過XssFilter.java已經(jīng)排除了靜態(tài)文件了。
但是發(fā)現(xiàn)靜態(tài)文件沒有使用瀏覽器緩存,新建BrowserCacheFilter.java并增加@WebFilter處理:
package com.ruoyi.framework.config; 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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @WebFilter(filterName = "browserCacheFilter", urlPatterns = {"*.css","*.jpg","*.js"}) public class BrowserCacheFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException{ Filter.super.init(filterConfig); } public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException{ HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)res; // response.addHeader("Cache-Control","no-cache"); // response.addHeader("Expires","Thu, 01 Jan 1970 00:00:00 GMT"); response.addHeader("Cache-Control","max-age=86400"); //86400s=24h chain.doFilter(request,response); } }
應(yīng)用自動(dòng)重啟后發(fā)現(xiàn)@WebFilter無效!
解決方案:
方案1:BrowserCacheFilter.java增加@Component 或 @Configuration
@Component @WebFilter(filterName = "browserCacheFilter", urlPatterns = {"*.css","*.jpg","*.js"}) public class BrowserCacheFilter implements Filter{
處理結(jié)果:重啟后可以進(jìn)入到init方法,但@WebFilter的urlPatterns無效,準(zhǔn)確地說,是@WebFilter仍然無效。
方案2:FilterConfig.java增加@Bean
package com.ruoyi.framework.config; import java.util.HashMap; import java.util.Map; import javax.servlet.DispatcherType; import org.nutz.lang.Lang; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.xss.XssFilter; /** * Filter配置 * * @author ruoyi */ @Configuration public class FilterConfig { @Value("${xss.enabled}") private String enabled; @Value("${xss.excludes}") private String excludes; @Value("${xss.urlPatterns}") private String urlPatterns; @SuppressWarnings({ "rawtypes", "unchecked" }) @Bean public FilterRegistrationBean xssFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setFilter(new XssFilter()); registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); registration.setName("xssFilter"); registration.setOrder(Integer.MAX_VALUE); Map<String, String> initParameters = new HashMap<String, String>(); initParameters.put("excludes", excludes); initParameters.put("enabled", enabled); registration.setInitParameters(initParameters); return registration; } /**增加BrowserCacheFilter過濾器*/ @Bean public FilterRegistrationBean browserCacheFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new BrowserCacheFilter()); registration.addUrlPatterns("*.css","*.js","*.jpg","*.png",""); return registration; } }
重啟后能進(jìn)入到init方法,并按【registration.addUrlPatterns(".css",".js",".jpg",".png","")】設(shè)置過濾靜態(tài)文件。
方案3:RuoYiApplication.java增加@ServletComponentScan
package com.ruoyi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.web.servlet.ServletComponentScan; /** * 啟動(dòng)程序 * @author ruoyi */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) @ServletComponentScan public class RuoYiApplication { public static void main(String[] args) { // System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(RuoYiApplication.class, args); ... } }
應(yīng)用重啟后能識(shí)別和處理@WebFilter注解,能進(jìn)入init方法并根據(jù)urlPatterns過濾靜態(tài)文件。
方案4:在FilterConfig.java增加@ServletComponentScan
package com.ruoyi.framework.config; import java.util.HashMap; import java.util.Map; import javax.servlet.DispatcherType; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.xss.XssFilter; /** * Filter配置 * @author ruoyi */ @Configuration @ServletComponentScan public class FilterConfig { @Value("${xss.enabled}") private String enabled; @Value("${xss.excludes}") private String excludes; @Value("${xss.urlPatterns}") private String urlPatterns; @SuppressWarnings({ "rawtypes", "unchecked" }) @Bean public FilterRegistrationBean xssFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setFilter(new XssFilter()); registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); registration.setName("xssFilter"); registration.setOrder(Integer.MAX_VALUE); Map<String, String> initParameters = new HashMap<String, String>(); initParameters.put("excludes", excludes); initParameters.put("enabled", enabled); registration.setInitParameters(initParameters); return registration; } }
應(yīng)用重啟后能識(shí)別和處理@WebFilter注解,能進(jìn)入init方法并根據(jù)urlPatterns過濾靜態(tài)文件。方案4只掃描該目錄或其子目錄的@WebFilter,其他目錄不會(huì)掃描。
總結(jié):
比較以上4個(gè)方案,方案4是最理想的解決方案。
到此這篇關(guān)于@WebFilter在SpringBoot無效的原因分析和解決方案的文章就介紹到這了,更多相關(guān)SpringBoot @WebFilter無效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Spring Security的詳細(xì)教程
這篇文章主要介紹了SpringBoot整合Spring Security的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java編程經(jīng)典小游戲設(shè)計(jì)-打磚塊小游戲源碼
這篇文章主要介紹了Java編程經(jīng)典小游戲設(shè)計(jì)-打磚塊小游戲源碼,還是挺不錯(cuò)的,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11不使用myeclipse注冊(cè)機(jī)得到myeclipse注冊(cè)碼的方法(myeclipse序列號(hào))
本文為大家介紹不使用myeclipse注冊(cè)機(jī)就能得到myeclipse注冊(cè)碼(序列號(hào))的方法, 運(yùn)行下面的JAVA代碼就可以了2014-01-01記錄一個(gè)使用Spring?Data?JPA設(shè)置默認(rèn)值的問題
這篇文章主要介紹了使用Spring?Data?JPA設(shè)置默認(rèn)值的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Springcloud基于OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用代碼實(shí)例
這篇文章主要介紹了Springcloud基于OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08基于SpringBoot實(shí)現(xiàn)自動(dòng)裝配返回屬性的設(shè)計(jì)思路
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)自動(dòng)裝配返回屬性,這里涉及到的技術(shù)知識(shí)點(diǎn)有注解解析器,為什么用ResponseBodyAdvice這里解析?不在Filter,Interceptors,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-03-03