在实际应用开发中,跨域是一个比较常见的问题,解决方法可以用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. 高德SDK获取到的坐标转换为GPS真实坐标方法,Java版

    发现高德SDK不提供高德的坐标转GPS坐标(GCJ_02转WGS_84),下面是一份Java版的 /**************************** 文件名:GCJ2WGS.java 创建时间 ...

  2. solarwind之network Atlas

    1.  连接密码为空,连接到Orion     2.  连接后如下图   3.  直接拖动节点即可进行绘制地图   4.  查看它的相关属性          

  3. zabbix、agent端服务器图形化展示

    [root@agent ~]# cat /etc/hostname agent.zabbix.com [root@agent ~]# cat /etc/hosts 127.0.0.1   localh ...

  4. Facebook再次爆出安全漏洞,9000万用户受影响

    今年上半年开始,美国社交媒体Facebook因数据泄露事件和涉嫌操纵选举等问题频繁接受听证会拷问,然而事情却远没有结束.今年9月Facebook再次爆出安全漏洞,导致9000万用户可能受到影响. 根据 ...

  5. 使用highcharts动态绘制折线图——so easy

    之前学习highcharts发现网上的教程大部分是对highcharts数据的注释,如何动态绘制数据大部分一笔带过,让那些初涉开发的小白云里雾里,所以我就写了一篇这样的博客. <html> ...

  6. postgressql sql查询拼接多个字段为一个字段查询出来

    表年份 月份 数据1 数据22000 1 1 12000 2 2 12001 2 2 2 2001 5 5 4 希望的查询结果如下所示: 时间 数据1 数据22000年1月 1 12000年2月 2 ...

  7. 鸟哥的linux私房菜

    http://vbird.dic.ksu.edu.tw/linux_basic/linux_basic.php

  8. oracle 的交并差函数,intersect;union;minus。

    创建表并添加数据: --创建TABLE_A create table TABLE_A ( A ), B ) ); --给TABLE_A添加数据 insert into TABLE_A values(' ...

  9. 通过wget下载jdk

    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-co ...

  10. [luogu]P4365[九省联考]秘密袭击coat(非官方正解)

    题目背景 警告:滥用本题评测者将被封号 We could have had it all. . . . . . 我们本该,拥有一切 Counting on a tree. . . . . . 何至于此 ...