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