解决SpringBoot自定义 * 和跨域配置冲突的问题

作者:G·S 时间:2022-01-31 04:59:29 

SpringBoot自定义 * 和跨域配置冲突

技术栈

vue-cli3,springboot 2.3.2.RELEASE

问题引出

在做毕业设计过程中用到了自定义 * 验证登录。同时在springboot配置类中设置了跨域问题,出现跨域失败的情况。

原代码


@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
   @Override
   protected void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
               .allowedOrigins("*")
               .allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS")
               .allowedHeaders("*")
               .maxAge(3600);
       super.addCorsMappings(registry);
   }
   @Override
   protected void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new AuthInterceptor())
               .addPathPatterns("/**")
               .excludePathPatterns("/login/*","/register/*");
   }
}

经过了解和排查发现,当有请求发送到后台时,先被自定义 * 拦截,如果 * 验证没有问题,才会开始执行跨域配置。因此解决办法是让跨域配置在自定义 * 之前执行。而Filter的执行顺序大于自定义 * ,因此可以在Filter中实现跨域的配置。

新代码


@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
   @Override
   protected void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new AuthInterceptor())
               .addPathPatterns("/**")
               .excludePathPatterns("/login/*","/register/*");
   }
}

添加Filter


@Configuration
public class MyCorsFilter{
   private CorsConfiguration corsConfig(){
       CorsConfiguration corsConfiguration = new CorsConfiguration();
       corsConfiguration.addAllowedHeader("*");
       corsConfiguration.addAllowedMethod("*");
       corsConfiguration.addAllowedOrigin("*");
       corsConfiguration.setMaxAge(3600L);
       corsConfiguration.setAllowCredentials(true);
       return corsConfiguration;
   }
   @Bean
   public CorsFilter corsFilter(){
       UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
       source.registerCorsConfiguration("/**",corsConfig());
       return new CorsFilter(source);
   }
}

SpringBoot * 和addCorsMappings冲突

项目中最开始跨域问题是通过自定义过滤器CorsFilter对request处理的,可以很好的解决问题。

最近,新项目中准备通过如下代码解决跨域问题,结果发现登录超时的错误会出现跨域问题,其他问题都不会。


@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
   @Override
   public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**");
   }
}

因为登录超时的检查是在 * 中,所以推测是可能是 * 的执行在addCorsMappings生效之前。将CorsFilter代码拿到项目中后,果然没有这个问题了。所以这个bu基本上可以认定是是 * 和addCorsMappings生效顺序的问题。

来源:https://blog.csdn.net/weixin_43876438/article/details/115602730

标签:SpringBoot, , ,跨域
0
投稿

猜你喜欢

  • Java 程序内部是如何执行的?

    2022-04-29 20:18:36
  • 基于@RequestBody和@ResponseBody及Stringify()的作用说明

    2021-12-14 01:47:38
  • 全面解析Java中的引用类型

    2022-07-15 23:48:07
  • C#中Lambda表达式的用法

    2022-12-22 15:59:17
  • Android巧用DecorView实现对话框功能

    2022-07-14 14:03:40
  • C#使用SQL DataAdapter数据适配代码实例

    2021-11-29 11:51:15
  • Swagger及knife4j的基本使用详解

    2023-02-13 09:34:00
  • Android应用获取设备序列号的方法

    2021-07-17 00:55:31
  • Spring自动装配Bean实现过程详解

    2023-10-31 18:35:21
  • Spring Boot整合JWT的实现步骤

    2022-07-17 04:48:58
  • java基础的详细了解第四天

    2022-11-25 07:24:51
  • 浅析java 10中的var关键字用法

    2021-12-23 15:18:17
  • Default Methods实例解析

    2023-05-18 19:28:01
  • C#深浅拷贝的深入解析

    2023-03-28 18:36:28
  • C#多维数组学习使用

    2023-07-06 11:51:02
  • Android自定义控件之组合控件学习笔记分享

    2022-09-18 01:09:22
  • idea创建JAVA Class时自动生成头部文档注释的方法

    2023-07-10 18:53:07
  • Java 容器类源码详解 Set

    2022-03-21 18:08:40
  • 解决javac不是内部或外部命令,也不是可运行程序的报错问题

    2022-07-13 22:39:25
  • Android登录注册功能 数据库SQLite验证

    2023-10-01 20:58:55
  • asp之家 软件编程 m.aspxhome.com