@WebFilter在SpringBoot無效的原因分析和解決方案
問題描述:
使用Ruoyi的demo部署成功后,發(fā)現(xiàn)js、css等靜態(tài)文件都進入了過濾器,修改application.yml:
xss: # 過濾開關 enabled: true # 排除鏈接(多個用逗號分隔) # 手動增加.*\\.css,.*\\.jpg,.*\\.js,.*\\.map,注意使用的是正則表達式 excludes: /system/notice/*,.*\\.css,.*\\.jpg,.*\\.js,.*\\.map # 匹配鏈接 urlPatterns: /system/*,/monitor/*,/tool/*
自動重啟應用后發(fā)現(xiàn)過XssFilter.java已經排除了靜態(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);
}
}
應用自動重啟后發(fā)現(xiàn)@WebFilter無效!
解決方案:
方案1:BrowserCacheFilter.java增加@Component 或 @Configuration
@Component
@WebFilter(filterName = "browserCacheFilter", urlPatterns = {"*.css","*.jpg","*.js"})
public class BrowserCacheFilter implements Filter{
處理結果:重啟后可以進入到init方法,但@WebFilter的urlPatterns無效,準確地說,是@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;
}
}
重啟后能進入到init方法,并按【registration.addUrlPatterns(".css",".js",".jpg",".png","")】設置過濾靜態(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;
/**
* 啟動程序
* @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);
...
}
}
應用重啟后能識別和處理@WebFilter注解,能進入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;
}
}
應用重啟后能識別和處理@WebFilter注解,能進入init方法并根據(jù)urlPatterns過濾靜態(tài)文件。方案4只掃描該目錄或其子目錄的@WebFilter,其他目錄不會掃描。
總結:
比較以上4個方案,方案4是最理想的解決方案。
到此這篇關于@WebFilter在SpringBoot無效的原因分析和解決方案的文章就介紹到這了,更多相關SpringBoot @WebFilter無效內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot整合Spring Security的詳細教程
這篇文章主要介紹了SpringBoot整合Spring Security的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
不使用myeclipse注冊機得到myeclipse注冊碼的方法(myeclipse序列號)
本文為大家介紹不使用myeclipse注冊機就能得到myeclipse注冊碼(序列號)的方法, 運行下面的JAVA代碼就可以了2014-01-01
Springcloud基于OpenFeign實現(xiàn)服務調用代碼實例
這篇文章主要介紹了Springcloud基于OpenFeign實現(xiàn)服務調用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
基于SpringBoot實現(xiàn)自動裝配返回屬性的設計思路
這篇文章主要介紹了基于SpringBoot實現(xiàn)自動裝配返回屬性,這里涉及到的技術知識點有注解解析器,為什么用ResponseBodyAdvice這里解析?不在Filter,Interceptors,本文結合示例代碼給大家介紹的非常詳細,需要的朋友參考下吧2022-03-03

