springboot 設置CorsFilter跨域不生效的解決
設置CorsFilter跨域不生效的解決
問題描述
公司的前后端開發(fā)項目工程,在本地調試的時候遇到了跨域的問題,同事調我的服務一直提示跨域問題,然后前端nb他自己在哪里做了跨域處理,類似nginx那種,但是我還是百度去看了一下,在一個大佬的博客中發(fā)現(xiàn)了解決方案。
問題原因是是寫的判斷登錄的filter影響了登錄,原因是的這個filter執(zhí)行順序在corsfilter之前導致,于是修改了一下跨域設置的配置文件
解決方案
/**
* 使用CORS,用于解決ajax跨域訪問問題
*/
@Configuration
public class GlobalCorsConfig {
@Bean
public FilterRegistrationBean corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//1) 允許的域,不要寫*,否則cookie就無法使用了
//config.addAllowedOrigin("http://manage.leyou.com");
//config.addAllowedOrigin("http://www.leyou.com");
config.addAllowedOrigin("*");
//2) 是否發(fā)送Cookie信息
config.setAllowCredentials(true);
//3) 允許的請求方式
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
config.setMaxAge(3600L);
// 4)允許的頭信息
config.addAllowedHeader("*");
//2.添加映射路徑,我們攔截一切請求
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
//return new CorsFilter(configSource);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(configSource));
bean.setOrder(0);
return bean;
}
}
跨域配置CorsFilter不生效原因
項目中有多個Filter時,需要通過 @Order(Ordered.HIGHEST_PRECEDENCE) 注解設置過濾器的執(zhí)行順序
order的規(guī)則
1. order的值越小,優(yōu)先級越高
2. order如果不標注數(shù)字,默認最低優(yōu)先級,因為其默認值是int最大值
3. 該注解等同于實現(xiàn)Ordered接口getOrder方法,并返回數(shù)字。
如果使用如下注釋掉的方法進行設置跨域,F(xiàn)ilter的doFilter()方法中直接return出去時,前端會提示跨域
因為這個CorsConfig并沒有實現(xiàn)Filter接口,即使加上 @Order 注解也不會生效,需要通過如下新的方式返回一個新的FilterRegistrationBean出去,并設置order
import com.nanase.takeshi.constants.JwtConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* CorsConfig
* 跨域請求配置
*
* @author 725
* @date 2020/12/10 18:17
*/
@Slf4j
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 1 設置訪問源地址
corsConfiguration.addAllowedOrigin("*");
// 2 設置訪問源請求頭
corsConfiguration.addAllowedHeader("*");
// 3 設置訪問源請求方法
corsConfiguration.addAllowedMethod("*");
// 4 暴露哪些頭部信息
corsConfiguration.addExposedHeader(JwtConstant.HEADER);
return corsConfiguration;
}
/**
@Bean
public CorsFilter corsFilter() {
log.info("跨域設置。。。。");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 對接口配置跨域設置
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
*/
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
log.info("跨域設置。。。。");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 5 對接口配置跨域設置
source.registerCorsConfiguration("/**", buildConfig());
//有多個filter時此處設置改CorsFilter的優(yōu)先執(zhí)行順序
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
如何使用 Shell 腳本查看多個服務器的端口是否打開的方法
這篇文章主要介紹了如何使用 Shell 腳本來查看多個服務器的端口是否打開的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
mybatis-plus阻止全表更新與刪除的實現(xiàn)
BlockAttackInnerInterceptor 是mybatis-plus的一個內置攔截器,用于防止惡意的全表更新或刪除操作,本文主要介紹了mybatis-plus阻止全表更新與刪除的實現(xiàn),感興趣的可以了解一下2023-12-12
springboot如何去獲取前端傳遞的參數(shù)的實現(xiàn)
這篇文章主要介紹了springboot如何去獲取前端傳遞的參數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05

