同源策略
同源策略简述
首先来说说同源策略是什么和为什么要使用同源策略.
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。 可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略,它是由Netscape提出的一个著名的安全策略。
具体来说同源策略就是约束了连个域之间资源加载,要求只有当两个源的协议、主机和端口一致才能够进行交互。比如说https和http,aaa.bbb和ccc.bbb这些都是不同源的,注意的是即使是IP地址和对应URL也被视为不同源的。
同源策略与安全性
同源策略是以牺牲了可用性的基础上获取安全性。如果没有了同源策略,那么用户的信息将会被肆意获取。即使现在有同源策略我们搜索过的东西也不一样被获取分析并给你推送各种广告,当没有了同源策略,那情况将会更加不可收拾。举个简单的例子:我在我的网站中设置一个跳转到其他网站的请求,比如一个通过cookie登录过的网站,这个请求虽然是你客户端发起的请求但并不是你希望的请求,这样就会把信息泄露出去(好像说的有点乱。。。)。
同源策略的问题
但是这样的话就要求我们必须把业务建立在同一个主机上,但一些大型的项目显然并不能这样,所以就在项目中添加了JSONP
JSONP
JSONP简述
JSONP(JSON with Padding)是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据。另一个解决这个问题的新方法是跨来源资源共享。
简而言之JSONP就是利用标签没有限制同源策略进而实现跨域。一个简单的js跨域
前端代码:
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript">
function hello(data){
alert(data.name);
}
</script>
<script type="text/javascript" src="http://manage.jt.com/test.json"></script>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
</head>
不同源被被请求的JSP
hello({"id":"1","name":"tom"})
这里的hello必须和第一段代码的hello方法同名,因为从
JSONP程序简单例子
页面的JS调用:
<script type="text/javascript">
$(function(){
alert("测试访问开始!!!!!")
$.ajax({
url:"http://manage.jt.com/web/testJSONP",
type:"get", //jsonp只能支持get请求
dataType:"jsonp", //dataType表示返回值类型
jsonp: "callback", //指定参数名称
jsonpCallback: "hello", //指定回调函数名称
success:function (data){ //data经过jQuery封装返回就是json串
alert(data.id);
alert(data.name);
//转化为字符串使用
//var obj = eval("("+data+")");
//alert(obj.name);
}
});
})
</script>
编辑服务端程序
@RestController
public class WebJSONPController {
@RequestMapping("/web/testJSONP")
public JSONPObject testJSONP(String callback) {
User user = new User();
user.setId(10001);
user.setName("tomcat");
return new JSONPObject(callback,user);
}
}