- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章springboot+jsonp解决前端跨域问题小结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
现在咱们一起来讨论浏览器跨域请求数据的相关问题。说这样可能不是很标准,因为拒绝跨域请求数据并不是浏览器所独有的,之所以会出现跨域请求不了数据,是因为浏览器基本都实现了一个叫"同源策略"的安全规范。该规范具体是什么呢?我们在mdn上找到了一份资料,地址如下:
浏览器同源策略讲解 。
总的来说,当a网址和b网址在 协议 、 端口 、 域名 方面存在不同时,浏览器就会启动同源策略,拒绝a、b服务器之间进行数据请求.
说了同源策略,纸上得来终觉浅,绝知此事要躬行,到底同源策略是怎么体现的呢?下面我将结合代码一步一步进行演示.
1、a服务器请求不了b服务器的情况 。
既然是跨域,我就假设我有两个域名,分别是 a 和 localhost , a 表示小编在阿里云上主机域名, localhost 顾名思义就是小编的开发机器了。我们想象这样一个场景,在 localhost 上部署一个 index.html 文件,在 a 服务器上部署一个简单的 spring-boot 后台服务,并提供一个简单的接口暴露给 index.html 文件调用,最后浏览器请求 localhost 的 index.html 文件,看浏览器提示什么?
index.html 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<!doctype html>
<html>
<head>
<title>测试跨域访问</title>
<meta charset=
"utf-8"
/>
</head>
<body>
<script src=
"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"
></script>
<script type=
"text/javascript"
>
$(document).ready(function() {
$.ajax({
type :
"get"
,
async :
true
,
url :
"http://a/hello/map/getuser.json"
,// 请求a服务器上的接口
type :
"json"
,
success : function(data) {
// 打印返回的数据
console.log(
"success,and return data is "
+ data);
}
});
});
</script>
<h2>hello world</h2>
</body>
</html>
|
浏览器上请求 index.html 文件,显示如下:
可以发现,请求被浏览器给拒绝了,提示我们不允许跨域请求数据,很难受,怎么解决呢?
2、使用 jsonp 解决跨域请求 。
首先讲下原理,jsonp解决跨域问题主要利用了 <script> 标签的可跨域性,也就是 src 属性中的链接地址可以跨域访问的特性,因为我们经常将 src 属性值设置为cdn的地址,已加载相关的js库.
index.html 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<!doctype html>
<html>
<head>
<title>测试跨域访问</title>
<meta charset=
"utf-8"
/>
</head>
<body>
<script src=
"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"
></script>
<script type=
"text/javascript"
>
$(document).ready(function() {
$.ajax({
type :
"get"
,
async :
true
,
jsonp :
"callbackname"
,
// 后端接口参数名
jsonpcallback :
"callbackfunction"
,
// 回调函数名
url :
"http://a/hello/map/getuser.json"
,
datatype :
"jsonp"
,
// 数据格式为 jsonp
success : function(data) {
console.log(
"success"
);
}
});
});
</script>
<script type=
"text/javascript"
>
var callbackfunction = function(data) {
alert(
'接口返回的数据是:'
+ json.stringify(data));
};
</script>
</body>
</html>
|
a 服务器上的接口代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/**
*
* the class jsonbackcontroller.
*
* description:该控制器返回一串简单的json数据,json数据由一个简单的user对象组成
*
* @author: huangjiawei
* @since: 2018年6月12日
* @version: $revision$ $date$ $lastchangedby$
*
*/
@restcontroller
@requestmapping
(value =
"/map"
)
public
class
jsonbackcontroller {
private
static
final
logger logger = loggerfactory.getlogger(jsonbackcontroller.
class
);
/**
* 解决跨域请求数据
* @param response
* @param callbackname 前端回调函数名
* @return
*/
@requestmapping
(value =
"getuser.json"
)
public
void
getuser(httpservletresponse response,
@requestparam
string callbackname) {
user user =
new
user(
"huangjiawei"
,
22
);
response.setcontenttype(
"text/javascript"
);
writer writer =
null
;
try
{
writer = response.getwriter();
writer.write(callbackname +
"("
);
writer.write(user.tostring());
writer.write(
");"
);
}
catch
(ioexception e) {
logger.error(
"jsonp响应写入失败! 数据:"
+ user.tostring(), e);
}
finally
{
if
(writer !=
null
) {
try
{
writer.close();
}
catch
(ioexception e) {
logger.error(
"输出流关闭异常!"
, e);
}
writer =
null
;
}
}
}
}
|
后端传入一个参数 callbackname 回调函数名,然后返回一段js代码给前端,js代码格式如下:
callbackname + ( data ) + ,
浏览器请求 localhost 服务器上的 index.html 文件,结果如下:
上面这种方式是通过 jquery + jsonp 解决跨域问题的,刚刚不是说可以用 <script> 标签的 src 属性吗?四的.
localhost 服务器上的 index.html 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!doctype html>
<html>
<head>
<title>测试跨域访问</title>
<meta charset=
"utf-8"
/>
</head>
<body>
<script src=
"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"
></script>
<script type=
"text/javascript"
>
var callbackfunction = function(data) {
alert(
'接口返回的数据是:'
+ json.stringify(data));
};
</script>
<script type=
"text/javascript"
src=
"http://a/hello/map/getuser.json?callbackname=callbackfunction"
></script>
</body>
</html>
|
浏览器显示效果和上面一致。但此处需要注意的是, src 表示引入一个js文件,由于是直接调用接口,而接口返回的数据又刚好是一段js代码,故能被执行。另外,第二个 <script> 标签顺序不能颠倒,不然会出现 callbackfunction 函数找不到的情况.
工程代码地址 : https://github.com/smallercoder/jsonpdemo 。
最后总结下,解决跨域的方案有很多种,jsonp只是其中一种,具体情况需要具体分析。希望此文对你有帮助,谢谢阅读,欢迎github给颗 start ,么么哒!也希望大家多多支持我.
原文链接:https://juejin.im/post/5b1f8bc05188257d7541c2ce 。
最后此篇关于springboot+jsonp解决前端跨域问题小结的文章就讲到这里了,如果你想了解更多关于springboot+jsonp解决前端跨域问题小结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这是我的本地域名 http://10.10.1.101/uxsurvey/profile/dashboard 在 Controller 中,我为用户列表设置了一个操作 redirect(control
要处理 Canonical URL,最佳做法是执行 301 重定向还是更好地为 www 和非 www 域使用相同的 IP 地址? 例如: 想要的规范 URL/域是 http://example.com
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
我想创建一个 weblogic 集群,其中有两个托管服务器,每个服务器在物理上独立的远程计算机上运行 根据weblogic文档 All Managed Servers in a cluster mus
我正在运行 grails 3.1.4,但在创建允许我将多个域对象绑定(bind)到其他几个域对象的模式时遇到了问题。作为我正在尝试做的一个例子: 我有三个类(class)。书籍、作者和阅读列表。 作者
我试图使用@count函数来根据它获取数据,但是在没有崩溃报告的情况下它以某种方式崩溃了。 这是代码 class PSMedia: Object { @objc dynamic var id
有谁知道是否有办法只输入字母字符而不输入数字?我想过这样的事情 CREATE DOMAIN countryDomain AS VARCHAR(100) CHECK( VALUE ??? );
我的代码: const checkoutUrl = 'https://example.com/checkout/*' window.onload = startup() function st
一些不是我编写的应用程序,也不是用 PHP 编写的,它为域 www.example.com 创建了一个 cookie。 我正在尝试替换该 cookie。所以在 PHP 中我做到了: setcookie
什么是 oauth 域?是否有任何免费的 oauth 服务?我可以将它用于 StackApps registration 吗? ?我在谷歌上搜索了很多,但找不到答案。 最佳答案 这是redirect_
自从 In October 2009, the Internet Corporation for Assigned Names and Numbers (ICANN) approved the cre
我使用 apache 作为我的应用程序 Web 服务器的代理,并希望即时更改与 sessionid cookie 关联的域名。 该cookie有一个与之关联的.company.com域,我想使用apa
我只想托管一个子域到cloudflare。我不想将主域名的域名服务器更改为他们的域名服务器。真的有可能吗? 最佳答案 是的,这是可能的,但是需要通过CloudFlare合作伙伴进行设置,或者您需要采用
When using socket in the UNIX domain, it is advisable to use path name for the directory directory m
想象两个共享一个域类的 Grails 应用程序。也许是 Book 域类。 一个应用程序被标识为数据的所有者,一个应用程序必须访问域数据。类似于亚马逊和亚马逊网络服务。 我想拥有的应用程序将使用普通的域
我有一个包含字段“URL”的表单。第一部分需要用户在文本框中填写。第二部分是预定义的,显示在文本框的右侧。 例如,用户在文本框中输入“test”。第二部分预定义为“.example.com”。因此,总
如果我要关闭并取消分配 azure 中的域 Controller ,从而生成新的 vm Generationid,我需要采取哪些步骤来恢复它? 最佳答案 what steps do I need to
我想尝试使用 Azure 作为托管提供商(我有一个域)。我读过那篇文章https://learn.microsoft.com/en-us/azure/app-service-web/web-sites
所以.... 我想知道是否有人可以在这方面协助我? 基本上,我已经创建了一个自托管的Docker容器,用作构建代理(Azure DevOps) 现在,我已经开始测试代理,并且由于我们的放置文件夹位于W
我是一名优秀的程序员,十分优秀!