springboot 設置CorsFilter跨域不生效的解決

設置CorsFilter跨域不生效的解決

問題描述

公司的前後端開發項目工程,在本地調試的時候遇到瞭跨域的問題,同事調我的服務一直提示跨域問題,然後前端nb他自己在哪裡做瞭跨域處理,類似nginx那種,但是我還是百度去看瞭一下,在一個大佬的博客中發現瞭解決方案。

問題原因是是寫的判斷登錄的filter影響瞭登錄,原因是的這個filter執行順序在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) 是否發送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) 註解設置過濾器的執行順序

order的規則

1. order的值越小,優先級越高

2. order如果不標註數字,默認最低優先級,因為其默認值是int最大值

3. 該註解等同於實現Ordered接口getOrder方法,並返回數字。

如果使用如下註釋掉的方法進行設置跨域,Filter的doFilter()方法中直接return出去時,前端會提示跨域

因為這個CorsConfig並沒有實現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的優先執行順序
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: