在实际应用开发中,跨域是一个比较常见的问题,解决方法可以用jsonp,frame,cors等,

这里示例的是SpringBoot对CORS的支持的三种实现方式

第一种:配置一种全局的支持,这种方式需要新增一个配置类如下:

package com.wangx.boot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration
public class CORSConfiguration { @Bean
public WebMvcConfigurer webMvcConfigurer () {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
          //允许所有/api/路径下的访问跨域,允许http://localhost:8080的源跨域
registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");
}
};
}
}

  这样在别的服务中想要访问该服务的api路径下的所有资源都会被允许跨域请求,本示例在8080端口的服务下请求8082的服务的资源,请求页面代码如下:

  

<body>
<div onclick="getLabelsGet()">这是一个事件</div>
<p id = "data"></p>
</body>
<script type="text/javascript">
/* 创建 XMLHttpRequest 对象 */
var xmlHttp;
function GetXmlHttpObject(){
if (window.XMLHttpRequest){
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}else{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp;
}
// -----------ajax方法-----------//
function getLabelsGet(){
xmlHttp=GetXmlHttpObject();
if (xmlHttp==null){
alert('您的浏览器不支持AJAX!');
return;
}
var url="http://localhost:8082/api/say?name=jack";
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange=getOkGet;//发送事件后,收到信息了调用函数
xmlHttp.send();
}
function getOkGet(){
if(xmlHttp.readyState==1||xmlHttp.readyState==2||xmlHttp.readyState==3){
// 本地提示:加载中
}
if (xmlHttp.readyState==4 && xmlHttp.status==200){
var d= xmlHttp.responseText;
// 处理返回结果
var data = document.getElementById("data");
data.innerHTML = d;
console.log(d);
}
}
</script>

  当点击”这是一个事件“后,访问结果如下:

这样就实现了从一个服务器页面访问另一个服务器之间允许跨域的问题。除了注册一个Bean之外,也可以使用配置类实现WebMvcConfigurer接口来实现跨域,原理一样,都是通过重写addCorsMappings方法来实现跨域的,实现接口的代码如下:

package com.wangx.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration
public class CORSConfiguration implements WebMvcConfigurer { @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");
}
}

第二种:使用@CrossOrigin注解来实现跨域问题,这是最简单的也是可以控制粒度的一种方式,使用注解作用在方法上。则只用该方法允许跨域访问,作用在类上就只有该类中的所有接口允许访问,具体代码如下:

 @CrossOrigin注解作用到方法上:

package com.wangx.boot.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ApiController { @CrossOrigin(origins = {"http://localhost:8080", "null"})
@RequestMapping("/say")
public String say(String name) {
System.out.println(name);
return "name:" + name + "hello";
}
@RequestMapping("/to")
public String to(String name) {
System.out.println(name);
return "name:" + name + "hello";
}
}

  当在其他服务器页面上访问方法say()时,成功返回数据,访问to时报跨域错误。

@CrossOrigin作用到类上:

package com.wangx.boot.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = {"http://localhost:8080", "null"})
public class ApiController {
@RequestMapping("/say")
public String say(String name) {
System.out.println(name);
return "name:" + name + "hello";
}
@RequestMapping("/to")
public String to(String name) {
System.out.println(name);
return "name:" + name + "hello";
}
}

  作用到类上时,类中的所有接口均能够被访问别成功返回数据。运行结果与方式一相同

SpringBoot学习笔记(7)-----CORS支持解决跨域问题的更多相关文章

  1. springboot中通过cors协议解决跨域问题

    1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现. 针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨域问题我基本也是这么处 ...

  2. AJAX学习笔记2:XHR实现跨域资源共享(CORS)以及和JSONP的对比----转载

    1 前言: 首先对参考文章作者表示感谢,你们的经验总结给我们这些新手提供了太多资源.本文致力于解决AJAX的CORS问题,我在逻辑上进行了梳理:首先,系统的总结了CORS问题的起源-同源策略:其次,介 ...

  3. SpringBoot入门教程(十三)CORS方式实现跨域

    什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 跨域资源访问是经常会遇到的场景,当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资 ...

  4. springboot WebMvcConfigurer配置静态资源和解决跨域

    前言 虽然现在都流行前后端分离部署,但有时候还是需要把前端文件跟后端文件一起打包发布,这就涉及到了springboot的静态资源访问的问题.不单只是静态资源打包,比如使用本地某个目录作为文件存储,也可 ...

  5. CORS,jsonp解决跨域问题

    同源和跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...

  6. 学习ASP.NET Core(11)-解决跨域问题与程序部署

    上一篇我们介绍了系统日志与测试相关的内容并添加了相关的功能:本章我们将介绍跨域与程序部署相关的内容 一.跨域 1.跨域的概念 1.什么是跨域? 一个请求的URL由协议,域名,端口号组成,以百度的htt ...

  7. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  8. Spring MVC配置CORS(解决跨域请求)

    1. CORS 简介 同源策略(same origin policy)是浏览器安全的基石.在同源策略的限制下,非同源的网站之间不能发送 ajax 请求的. 为了解决这个问题,w3c 提出了跨源资源共享 ...

  9. springboot(十八):CORS方式实现跨域

    资料 https://www.cnblogs.com/toutou/p/9843588.html

随机推荐

  1. Post请求JSON格式数据,cookies获得

    x.Ext.init(getApplication()); editText1= (EditText) findViewById(R.id.username); editText2= (EditTex ...

  2. c# rc4算法,加密解密类

    rc4算法,原理,以密匙生成256位的密匙流,然后以车轮式滚过源数据异或加密. /* * 由SharpDevelop创建. * 用户: YISH * 日期: 04/04/2015 * 时间: 03:0 ...

  3. 如何使用pgpool failover_stream.sh自己控制选择指定的master节点

    集群架构: h236:master h237:standby sync h238:standby sync h239:stadnby async h240:standby async h241:sta ...

  4. POJ 3624 Charm Bracelet【01背包】

    解题思路:直接套公式就能做的01背包, for(i=1;i<=n;i++) { for(v=w[i];v<=m;v++) f[i,v]=max(f[i,v],f[i-1,v-w[i]]+d ...

  5. 路飞学城Python-Day48

    49-清除浮动1:给父盒子设置高度 给父盒子设置高度,这种方式不灵活,公司的产品修改的时候,要求父盒子高度变大, 不可能去手动修改 尽量不要给父元素去修改高度,不建议这样的方式 <!DOCTYP ...

  6. 小程序做一个能够左右滑动切换的多tab页面

    主要原理:使用 <swiper> 和 <scroll-view> 组件 代码片段: https://developers.weixin.qq.com/s/mLx4FWmF757 ...

  7. 解决tpcc_load 报错 error while loading shared libraries: libmysqlclient.so.20

    在刚开始导入tpcc数据仓库时,可能会遇到 error while loading shared libraries: libmysqlclient.so.20这个错误,找不到库文件. 但是,通过fi ...

  8. Vue系列(三):组件及数据传递、路由、单文件组件、vue-cli脚手架

    上一篇:Vue系列(二):发送Ajax.JSONP请求.Vue生命周期及实例属性和方法.自定义指令与过渡 一. 组件component 1. 什么是组件? 组件(Component)是 Vue.js ...

  9. visual studio 2015将已有项目添加到码云(gitee)

    visual studio 2015将已有项目添加到码云的步骤包括:gitee新建项目.清空项目及VS发布项目 1.gitee新建项目 2.清空项目 清空项目则会将vs项目的master分支发布到gi ...

  10. java源码之TreeMap

    Map的单元是对键值对的处理,之前分析过的两种Map,HashMap和LinkedHashMap都是用哈希值去寻找我们想要的键值对,优点是理想情况下O(1)的查找速度. 那如果我们在一个对查找性能要求 ...