springboot 设置CorsFilter跨域不生效的解决

 更新时间:2021年11月16日 08:54:01   作者:小松博客  
这篇文章主要介绍了springboot 设置CorsFilter跨域不生效的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

设置CorsFilter跨域不生效的解决

问题描述

公司的前后端开发项目工程,在本地调试的时候遇到了跨域的问题,同事调我的服务一直提示跨域问题,然后前端nb他自己在哪里做了跨域处理,类似nginx那种,但是我还是百度去看了一下,在一个大佬的博客中发现了解决方案。

问题原因是是写的判断登录的filter影响了登录,原因是的这个filter执行顺序在corsfilter之前导致,于是修改了一下跨域设置的配置文件

解决方案

/**
 * 使用CORS,用于解决ajax跨域访问问题
 */
@Configuration
public class GlobalCorsConfig {
    @Bean
    public FilterRegistrationBean corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //1) 允许的域,不要写*,否则cookie就无法使用了
        //config.addAllowedOrigin("http://manage.leyou.com");
        //config.addAllowedOrigin("http://www.leyou.com");
        config.addAllowedOrigin("*");
        //2) 是否发送Cookie信息
        config.setAllowCredentials(true);
        //3) 允许的请求方式
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        config.setMaxAge(3600L);
        // 4)允许的头信息
        config.addAllowedHeader("*");
 
        //2.添加映射路径,我们拦截一切请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
 
        //3.返回新的CorsFilter.
        //return new CorsFilter(configSource);
 
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(configSource));
        bean.setOrder(0);
        return bean;
    }
}

跨域配置CorsFilter不生效原因

项目中有多个Filter时,需要通过 @Order(Ordered.HIGHEST_PRECEDENCE) 注解设置过滤器的执行顺序

order的规则

1. order的值越小,优先级越高

2. order如果不标注数字,默认最低优先级,因为其默认值是int最大值

3. 该注解等同于实现Ordered接口getOrder方法,并返回数字。

如果使用如下注释掉的方法进行设置跨域,Filter的doFilter()方法中直接return出去时,前端会提示跨域

因为这个CorsConfig并没有实现Filter接口,即使加上 @Order 注解也不会生效,需要通过如下新的方式返回一个新的FilterRegistrationBean出去,并设置order

import com.nanase.takeshi.constants.JwtConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
 * CorsConfig
 * 跨域请求配置
 *
 * @author 725
 * @date 2020/12/10 18:17
 */
@Slf4j
@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 1 设置访问源地址
        corsConfiguration.addAllowedOrigin("*");
        // 2 设置访问源请求头
        corsConfiguration.addAllowedHeader("*");
        // 3 设置访问源请求方法
        corsConfiguration.addAllowedMethod("*");
        // 4 暴露哪些头部信息
        corsConfiguration.addExposedHeader(JwtConstant.HEADER);
        return corsConfiguration;
    }
    /**
	@Bean
    public CorsFilter corsFilter() {
        log.info("跨域设置。。。。");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对接口配置跨域设置
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
    */
    
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
        log.info("跨域设置。。。。");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 5 对接口配置跨域设置
        source.registerCorsConfiguration("/**", buildConfig());
        //有多个filter时此处设置改CorsFilter的优先执行顺序
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring 使用Validation 验证框架的问题详解

    Spring 使用Validation 验证框架的问题详解

    Spring Boot在内部通过集成hibernate-validation已经实现了JSR-349验证规范接口,在Spring Boot项目中只要直接使用就行了。 一般用在Controller中用于验证前端传来的参数。这篇文章给大家介绍Spring Validation 验证框架的相关知识,感兴趣的朋友一起看看吧
    2021-07-07
  • Idea跑的项目没问题将程序install成jar包运行报错空指针的问题

    Idea跑的项目没问题将程序install成jar包运行报错空指针的问题

    这篇文章主要介绍了Idea跑的项目没问题,将程序install成jar包运行报错空指针的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • java操作Redis缓存设置过期时间的方法

    java操作Redis缓存设置过期时间的方法

    这篇文章主要介绍了java操作Redis缓存设置过期时间的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • SpringBoot整合JPA数据源方法及配置解析

    SpringBoot整合JPA数据源方法及配置解析

    这篇文章主要介绍了SpringBoot整合JPA数据源方法及配置解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 使用Mybatis-plus实现时间自动填充(代码直接可用)

    使用Mybatis-plus实现时间自动填充(代码直接可用)

    这篇文章主要介绍了使用Mybatis-plus实现时间自动填充(代码直接可用),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring配置类源码分析详解

    Spring配置类源码分析详解

    这篇文章主要介绍了Spring配置类解析源码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Spring实战之注入嵌套Bean操作示例

    Spring实战之注入嵌套Bean操作示例

    这篇文章主要介绍了Spring实战之注入嵌套Bean操作,结合实例形式分析了嵌套Bean相关配置与使用操作技巧,需要的朋友可以参考下
    2019-11-11
  • java实现将ftp和http的文件直接传送到hdfs

    java实现将ftp和http的文件直接传送到hdfs

    前面几篇文章,我们已经做了很好的铺垫了,几个要用到的工具我们都做了出来,本文就是将他们集合起来,说下具体的用法,小伙伴们可以参考下。
    2015-03-03
  • SpringMVC中的表现层结果封装

    SpringMVC中的表现层结果封装

    这篇文章主要介绍了SpringMVC中的表现层结果封装,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java mybatis 开发自定义插件

    Java mybatis 开发自定义插件

    这篇文章主要介绍了Java mybatis开发自定义插件,MyBatis允许你在映射语句执行过程中的某一点进行拦截调用,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论