springboot(十三)cors方式实现跨域

请叫我头头哥      2022-04-20     431

关键词:

什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 。 跨域资源访问是经常会遇到的场景,当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源便会发起一个跨域 HTTP 请求。出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求。

vCORS方式实现跨域

跨域的方式有很多种, 今天主要介绍CORS(网络通信技术),全称Cross-Origin Resource Sharing  ,是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。

v服务端配置

由于CORS方式实现跨域需要服务端配合设置Header,在springboot中只需要添加以下配置即可,或者在需要支持跨域的方法中直接对response设置header,以下三种方式效果相同。

第一种:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    /**
     * 重写addCorsMappings方法实现跨域的设置
     * 当然跨域还可以通过在Controller或方法上添加‘@CrossOrigin("http://domain2.com")’的注解实现,不过下面这种方便统一管理
     * 参考:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("http://a.test.com")  //允许的origin
            .allowedMethods("GET", "POST", "DELETE") //允许的方法
            .allowCredentials(true) //是否允许携带cookie
            .maxAge(3600);
    }

    //全局跨域,Enabling CORS for the whole application is as simple as:
    /*@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }*/   
}

第二种:

@RequestMapping
public Object index(HttpServletRequest request, HttpServletResponse response, @CookieValue(value = "sid", required = false) String sid) {
    response.setHeader("Access-Control-Allow-Origin","http://a.test.com"); //允许跨域的Origin设置
    response.setHeader("Access-Control-Allow-Credentials","true"); //允许携带cookie
    logger.info("cookie sid = " + sid);
    return restTemplateService.someRestCall();
}

第三种:

@RequestMapping
@CrossOrigin(origins = "http://a.test.com", allowCredentials = "true")
public Object index(HttpServletRequest request, @CookieValue(value = "sid", required = false) String sid) {
    logger.info("cookie sid = " + sid);
    return restTemplateService.someRestCall();
}

v前端调用方式

1. 原生ajax调用示例:

var xhr = new XMLHttpRequest();  
xhr.open("POST", "http://b.test.com/api/rest", true);  
xhr.withCredentials = true; //支持跨域发送cookies
xhr.send();

2. jQuery调用示例:

$.ajax({
    url: ‘http://b.test.com/api/rest‘,
    dataType: ‘json‘,
    type : ‘POST‘,
    xhrFields: {
        withCredentials: true //是否携带cookie
    },
    crossDomain: true,
    contentType: "application/json",
    success: (res) => {
      console.log(res);
    }
  });

3. fetch方式

fetch(‘http://b.test.com/api/rest‘, 
  {credentials: ‘include‘}  //注意这里的设置,支持跨域发送cookies
).then(function(res) {
  if (res.ok) {
    res.json().then(function(data) {
      console.log(data.value);
    });
  } else {
    console.log("Looks like the response wasn‘t perfect, got status", res.status);
  }
}, function(e) {
  console.log("Fetch failed!", e);
});

springboot中实现跨域的5种方式(代码片段)

对于CORS的跨域请求,主要有以下几种方式可供选择:1、返回新的CorsFilter(全局跨域)packagecom.cfit.framework.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.Cor... 查看详情

springboot中通过cors解决跨域问题

同源策略源(origin)就是协议(http)、域名(localhost)和端口号(8080),同源是指协议、域名以及端口要相同。No‘Access-Control-Allow-Origin‘headerispresentontherequestedresource.后端使用CORS(跨域源资源共享)(CORS,Cross-originresourceshari... 查看详情

springboot跨域(cors)支持:注解@crossorigin

跨域(CORS)支持出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不... 查看详情

详解cors跨域的几种不同实现方式(代码片段)

CORS定义CORS是一个W3C标准,全称是"跨域资源共享"(Cross-originresourcesharing),它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。提供了Web服务从不同域传来沙盒脚本的方法,以避开浏览器的... 查看详情

springboot实现跨域请求

参考技术A        为了保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.这叫做同源,同源策略是浏览器的安全基石.    如果一个请求地址里面协议,域... 查看详情

java实现cors跨域请求

...要有以下几种:JSONP、iframe、代理模式、CORS等等前面几种方式在这里不讲,网上有很多资料。在这里我主要分享一下CORS这种解决方式 查看详情

springboot解决跨域问题跨域

使用vue+axios+springboot前后端分离项目时会出现跨域问题解决方式:一:全局配置1/**2*就是注册的过程,注册Cors协议的内容。3*如:Cors协议支持哪些请求URL,支持哪些请求类型,请求时处理的超时时长是什么等。4*/5@Override6publicvoidaddC... 查看详情

springboot学习-springboot添加支持cors跨域访问(代码片段)

...台服务器出现跨域错误,下面我就讲一下如何让你的SpringBoot项目支持CORS跨域。第一步搭建Sp 查看详情

蚂蚁二面:springboot实现跨域有几种方式?

一、为什么会出现跨域问题出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说W... 查看详情

ajax学习笔记2:xhr实现跨域资源共享(cors)以及和jsonp的对比

...—同源策略;其次,介绍JSONP这种仅能支持GET请求的跨域方式和CORS作对比;最后,阐述CORS的XHR解决方式和IE中的XDR解决方式,在此基础上提供了工具函数进行跨浏览器的HTTP请求对象创建。2跨域问题的源头—同源 查看详情

springboot跨域cors处理

一源(Origin)源指URL的协议,域名,端口三部分组成,如果这个三个成分都相同,就判定是同源,否则为不同源。同源策略(Sameoriginpolicy)是一种浏览器的约定,即在浏览器中禁止非同源访问。二CORSCORS即"跨域资源共享"(C... 查看详情

36springboot配置cors解决跨域请求

CORS(Cross-OriginResourceSharing)"跨域资源共享",是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问本站内的资源限制,CORS在很多地方都有被使用,微信支付的JS支付就是通过JS向微信服务器发送跨... 查看详情

springboot中通过cors解决跨域问题

今天和小伙伴们来聊一聊通过CORS解决跨域问题。同源策略很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。同源策略是由Netscape提出的一个著名的安全... 查看详情

实战,springboot中如何解决cors跨域问题~(文末送书)

CORS(Cross-OriginResourceSharing)"跨域资源共享",是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问本站内的资源限制。在前后分离的架构下,我们经常会遇到跨域CORS问题,... 查看详情

实战,springboot中如何解决cors跨域问题~(文末送书)(代码片段)

...in'headerispresentontherequestedresource.下面看一下如何让你的SpringBoot项目支持CORS跨域。SpringBoot处理跨域在SpringBoot后端处理跨域比较简单,只需要在项目中添加如下一个配置类即可:/** * Spring Boot 2.0 解决跨域问题 * @... 查看详情

springboot整合shiro涉及跨域和@cacheable缓存/@transactional事务注解失效问题

...离项目中)  (1) 跨域介绍可参考:跨域(CORS)  (2)SpringBoot中解决跨域方式有:    A.使用@CrossOrigin注解;    B.实现Filter类,重写doFilter方法packagecom.ruhuanxingyun.config;importcn.hutool.core.util.StrUtil;importorg.spri 查看详情

springboot配置cors跨域的几种方法(代码片段)

作记录用请参考https://blog.csdn.net/lizc_lizc/article/details/81155895 第一种:  在每个controller上添加 @CrossOrigin第二种:使用拦截器  1、方法一@ConfigurationpublicclassCorsConfig@BeanpublicCorsFiltercorsFilter()final 查看详情

cors跨域请求问题

...:需要在nginx进行额外配置,语义不清晰2.后台处理,与SpringBoot启动类同级目录下新建一个配置类参考文章:https://www.jianshu.com/p/98d4bc7565b2 查看详情