一、JS跨域问题
1.1 HttpClient优化
利用浏览器解析JS,发起AJax请求,之后从后台服务器中获取数据
- 域名相同时可以实现访问
- 当域名与访问网址域名不同时,发现服务无法正常调用
后面的单点登录系统
SSO
将使用JSONP来实现跨域问题
1.2 同源策略
浏览规定:如果满足 协议名称://域名:端口号等都相同时表示同域访问
但是如果上述条件中有一项不同.则表示跨域访问.浏览器不予解析返回值.(安全策略)
如下图是同源策略案例
1.3 跨域实现原理
- 利用javaScript中的src属性实现跨域.
- 定义回调函数.
- 将返回值结果进行特殊格式封装 callback(JSON数据)
传统跨域存在的问题:
- 发送跨域请求时利用javaScript中的src属性.这样的操作不通用.
- 自己手动定义回调函数.
- 返回的数据必须经过回调函数名称封装.但是名称如何保证一致
所以使用JSONP实现跨越
1.4 JSONP
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
利用
1.4.1 JSONP方式调用
- 可以利用传统ajax实行实现数据请求
- 利用js自动生成一个回调函数.并且名称随意,发送请求时自动携带回调函数名称.
url?callback="XXXXXXXX"
- 动态获取回调函数名称,将数据进行封装
callback(JSON);
1.4.2 编辑JS实现跨域访问
<script type="text/javascript">
$(function () {
alert("测试访问开始!!!!!")
$.ajax({
url: "http://manage.jl.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);
}
});
})
</script>
1.4.2 API实现JSONP访问
调用
JSONPObject(String function, Object value)
方法
function
为回调函数名称;value
为返回的对象数据这个API底层实现了 :
1.将对象转换为JSON :
String json = ObjectMapperUtil.toJSON(itemDesc);
2.拼接字符串 :
callback+"("+json+")"
//利用API实现JSONP跨域访问
@RequestMapping("/web/testJSONP")
public JSONPObject testJSONP(String callback) {
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(10001L).setItemDesc("商品详情信息!!!!!!");
return new JSONPObject(callback, itemDesc);
}
随手笔记
1.JSONP 与 cros 解决跨域问题区别
JSONP 用于
get
请求,查询功能 ,不能用于post
请求,后台使用这个cros 手机端用的多,可以用于get和post请求,目前用的很少了
目前,前端都用
Vue
框架,直接调用工具就可以很简单的解决跨越问题
2.Find in Path 全局查找
Eclipse :
Ctrl+H