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

2022-07-20,,,,

目录

设置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;
    }
}

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

《springboot 设置CorsFilter跨域不生效的解决.doc》

下载本文的Word格式文档,以方便收藏与打印。