天天看點

SpringBoot2.x整合Shiro出現cors跨域問題(踩坑記錄)

1. Springboot如何跨域?

最簡單的方法是:

定義一個配置CorsConfig類即可(是不是簡單且無耦合到令人發指)

@Configuration
public class CorsConfig {
 
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");        
        corsConfiguration.setMaxAge(3600L);         // 預檢請求的有效期,機關為秒。
        corsConfiguration.setAllowCredentials(true);// 是否支援安全證書(必需參數)
        return corsConfiguration;
    }
 
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}      

不要用WebMvcConfigurerAdapter繼承的方法了,因為已經過時了,Springboot2.0已經不推薦此方法

此處有一個比較坑的地方就是:

corsConfiguration.setMaxAge(3600L);         // 預檢請求的有效期,機關為秒。

corsConfiguration.setAllowCredentials(true);// 是否支援安全證書(必需參數)

這兩句務必要加上,不然無論前端怎麼做,也無論背景你對shiro的過濾器怎麼重寫,response請求傳回狀态都是302。

網絡上大家的代碼都是copy來copy去,往往沒有這2句,是以這個坑真是眼淚汪汪。

2. 前端在發送請求是,是否需要加上跨域參數?(以下兩句為跨域參數)

crossDomain: true,                       

xhrFields: {withCredentials: true},

答案是肯定的。

如果不加跨域參數,通過在ShiroConfig中配置某些URL不鑒權(匿名通路),倒也可以(但是不推薦,你不可能把所有的URL都設定為匿名通路,那要鑒權做什麼?)。

filterChainDefinitionMap.put("/login/**", "anon");   //類似于URL路徑中含有login的不鑒權

那麼這兩句的作用是什麼?    -- 利用cookie維持session的會話跟蹤。

good luck!

參考文章:https://blog.csdn.net/wangchsh2008/article/details/90324631