SpringBoot(十三)CORS方式实现跨域

什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 。 跨域资源访问是经常会遇到的场景,当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源便会发起一个跨域 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);
});

原文地址:https://www.cnblogs.com/toutou/p/9843588.html

时间: 2024-07-29 10:04:52

SpringBoot(十三)CORS方式实现跨域的相关文章

cors解决Web跨域访问问题

首先了解一下什么是跨域以及解决的几种常见方式. 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同. 举例: 相对于http://store.company.com/dir/page.html 常见的解决跨域访问的方法: 1.JSONP2.window.name + iframe3.hash + iframe4.postMessage5.CORS6.WebSockets 概念科普: CORS是W3c工作草案,它定

.Net Core 3.0 Api json web token 中间件签权验证和 CORS 中间件处理跨域请求

第一步:在Nuget上安装"Microsoft.AspNet.WebApi.Cors"包,并对api controller使用[EnableCors]特性以及Microsoft.AspNetCore.Authentication.JwtBearer包 第二步:创建.netcore API项目 /控制器:AuthenticateController using System; using System.Collections.Generic; using System.Linq; usi

通过注解的方式允许跨域

SpringMVC解决跨域的两种方案 1. 什么是跨域 跨域,即跨站HTTP请求(Cross-site HTTP request),指发起请求的资源所在域不同于请求指向资源所在域的HTTP请求. 2. 跨域的应用情景 当使用前后端分离,后端主导的开发方式进行前后端协作开发时,常常有如下情景: 后端开发完毕在服务器上进行部署并给前端API文档. 前端在本地进行开发并向远程服务器上部署的后端发送请求.在这种开发过程中,如果前端想要一边开发一边测试接口,就需要使用跨域的方式. 3. 通过注解的方式允许

使用微软CORS包不能跨域访问的问题

使用jquery的ajax异步调用的时候会出现不能跨域访问的问题,这个问题一般有两种方法. 1:使用jsonp跨域 2:使用html5的CORS 在这里只谈论第二种,微软对CORS提供的了支持,在NuGet安装Microsoft.AspNet.WebApi.Cors就可以使用跨域的功能. 但是事实并不是这样,在有的时候使用了这个DLL然后添加跨域的方法依然没有效果. 那我们可以使用其他的方法解决这类问题. 最简单的就是修改Web.config文件 在system.webServer节点下复制如下

基于CORS的GeoServer跨域访问策略

GeoServer的跨域访问问题,有多种解决方法,本文介绍一种基于CORS的GeoServer跨域访问方法. CORS简介 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.通常由于同域

八种方式实现跨域请求

浏览器的同源策略 ? 提到跨域不能不先说一下"同源策略". ? 何为同源?只有当协议.端口.和域名都相同的页面,则两个页面具有相同的源.只要网站的 协议名protocol. 主机host. 端口号port 这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用,会受到同源策略的限制. ? 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制.浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本(如 JavaScr

通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!

以下代码只是为演示该方法具体是如何操作的,实际的意义并不大. 其实这个方法还可以解决很多方面的跨域操作,以下两点为我工作中遇到的情况! 比如A系统中打开B系统页面的时候,获取B系统页面高度,A系统中可以动态设置窗口的高度 还有A系统中打开B系统页面的时候,B系统页面进行一系列操作,操作成功后需关闭A系统窗口,就可以在操作成功后再在B系统中嵌入A系统的blank.html页面,blank.html页面打开的时候,动态关闭A系统的窗口! 下面为大家讲下是如何实现该方法的 1.在A系统下添加名称为bl

CORS解决WebApi跨域问题(转)

CORS全称Cross-Origin Resource Sharing,中文全称跨域资源共享.它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求 在WebApiCORS项目上面使用Nuget搜索"microsoft.aspnet.webapi.cors" 然后在App_Start文件夹下面的WebApiConfig.cs文件夹配置跨域 public static class WebApiConfig { public static

CORS 协议(跨域资源共享)

  跨域问题 只要协议.域名.端口有任何一个不同,都被当作是不同的域.   为什么会有跨域的限制? 之前发生过的一些跨域安全事件: 新浪微博XSS受攻击事件 2011年6月28日晚,新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:"郭美美事件的一些未注意到的细节","建党大业中穿帮的地方","让女人心动的100句诗歌","3D肉团团高清普通话版种子","这是传说中的神仙眷侣啊","