項目採用先後端分離,服務器端添加了全局的跨域配置,可是卻出現了跨域問題,分析了屢次請求發現有一部分請求並無出現跨域,沒有出現跨域的請求恰好就是攔截器放行的地址,因此分析多是權限攔截器處理在跨域處理以前進行致使跨域配置失效。java
剛開始的跨域配置,繼承WebMvcConfigurer 類重寫addCorsMappings方法:後端
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } /** * 攔截器配置 * * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { // 須要排除的地址 String[] excludePath = { // 註冊登陸 "/user/openId", "/user/register", "/user/login", // 錯誤頁面 "/error/**", // 帶後綴的靜態資源 "/**/**.*" }; registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") .excludePathPatterns(excludePath) .excludePathPatterns(); } /** * 跨越配置 * * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { // 設置容許跨域的路徑 registry.addMapping("/**") // 是否容許證書 再也不默認開啓 .allowCredentials(true) // 容許任何頭 .allowedHeaders("*") // 設置容許跨域請求的域名 .allowedOrigins("*") // 設置容許的方法 .allowedMethods("*") // 跨域容許時間 .maxAge(3600) .exposedHeaders("token"); } }
改用過濾器CorsFilter 來配置跨域,因爲Filter的位置是在Interceptor以前的(Filter之間經過order設置優先級),問題獲得解決:跨域
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } /** * 攔截器配置 * * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { // 須要排除的地址 String[] excludePath = { // 註冊登陸 "/user/openId", "/user/register", "/user/login", "/user/loginByOpenId", "/user/updatePassword", // 手機短信 "/phone/**", "/hospital/get/**", // 微信支付成功回調 "/order/callback/**", // 服務號接口 "/serve/**", // im羣消息回調 "/im/callback/**", // 測試地址 "/test/**", // 手機號白名單 "/demoPhone/**", // 錯誤頁面 "/error/**", // 帶後綴的靜態資源 "/**/**.*", "/followup/**/**.*", "/imageControlWX/**/**.*", "/pc/**/**.*", "/qrcode/**/**.*", "/recipe/**/**.*", "/writeRecipe/**/**.*" }; registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") .excludePathPatterns(excludePath) .excludePathPatterns(); } /** * 跨越配置 */ @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 設置容許跨域請求的域名 config.addAllowedOrigin("*"); // 是否容許證書 再也不默認開啓 // config.setAllowCredentials(true); // 設置容許的方法 config.addAllowedMethod("*"); // 容許任何頭 config.addAllowedHeader("*"); config.addExposedHeader("token"); UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); return new CorsFilter(configSource); } }