跨域问题的解决

实现跨域访问

虽然原理比较复杂,但是:

  • 浏览器端都由浏览器自动完成,我们无需操心
  • 服务端可以通过拦截器统一实现,不必每次都去进行跨域判定的编写。

事实上,SpringMVC已经帮我们写好了CORS的跨域过滤器:CorsFilter ,内部已经实现了刚才所讲的判定逻辑,我们直接用就好了。

ps:

如果是微服务可以直接在gateway中创建配置文件

1).编写application.yaml文件:

ly:
  cors:
    allowedOrigins: #允许的域,不要写*,否则cookie就无法使用了
      - http://www.leyou.com
      - http://manage.leyou.com
    allowCredentials: true  #是否发送Cookie信息
    allowedMethods:  #允许的请求方式
      - DELETE
      - OPTIONS
      - HEAD
      - GET
      - POST
      - PUT
    allowedHeaders:  #允许的头信息
      - "*"
    maxAge: 3600000  #有效期(毫秒)
    filterPath: "/**"  #添加映射路径,我们拦截一切请求

2).配置文件加载类:

package com.leyou.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;

/**
 * 配置文件加载类
 */
@Data
@ConfigurationProperties(prefix = "ly.cors") // 这注解必须要有类打上@EnableConfigurationProperties(CORSProperties.class)这个注解才能生效
public class CORSProperties {
    private List<String> allowedOrigins;
    private Boolean allowedCredentials;
    private List<String> allowedMethods;
    private List<String> allowedHeaders;
    private Long maxAge;
    private String filterPath;
}

3).编写一个配置类,并且注册CorsFilter:

package com.leyou.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 全局CORS配置文件
 */
@Configuration
@EnableConfigurationProperties(CORSProperties.class) // 让使用 @ConfigurationProperties 注解的类生效。
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter(CORSProperties prop) {
        // 1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        // 1) 允许的域,不要写*,否则cookie就无法使用了
        prop.getAllowedOrigins().forEach(config::addAllowedOrigin);
        // 2) 是否发送Cookie信息
        config.setAllowCredentials(prop.getAllowedCredentials());
        // 3) 允许的请求方式
        prop.getAllowedMethods().forEach(config::addAllowedMethod);
        // 4)允许的头信息
        prop.getAllowedHeaders().forEach(config::addAllowedHeader);
        // 5)有效期
        config.setMaxAge(prop.getMaxAge());

        //2.添加映射路径,我们拦截一切请求
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration(prop.getFilterPath(),config);

        //3.返回新的CORSFilter.
        return new CorsFilter(source);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值