欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 20:28:38
目录设置corsfilter跨域不生效的解决问题描述解决方案跨域配置corsfilter不生效原因order的规则设置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;
    }
}

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