项目采用先后端分离,服务器端添加了全局的跨域配置,可是却出现了跨域问题,分析了屡次请求发现有一部分请求并无出现跨域,没有出现跨域的请求恰好就是拦截器放行的地址,因此分析多是权限拦截器处理在跨域处理以前进行致使跨域配置失效。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); } }