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