js原生态跨域请求与ajax中jsonp跨域请求
来源:互联网 发布:阿利伯克级驱逐舰数据 编辑:程序博客网 时间:2024/05/16 18:14
在web开发中我们经常会说起脚本的跨域访问的问题,会出现跨域访问的限制是因为javascript语言安全限制中的同源策略(same-origin policy )所造成的。
同源策略简单的说就是一段脚本只能读取来自于同一来源的资源,这里的同一来源指的是主机名、协议和端口号的组合;举个例子具体说明
我们的主机地址http://localhost:8080/test/b.html的js脚本访问下列url的结果和原因
URL 结果 原因
http://localhost:8080/tset/d.html 成功
https://localhost:8080/tset/c.html 失败 协议不同
http://localhost:8080/tset/c.html 失败 端口不同
http://www.sina.com.cn/a/b.html 失败 主机名不同
所有只有当访问的url中,协议,主机名,端口号一致是才被视为同一来源,其他情况则一般为跨域请求。
出现了跨域请求我们已经如何解决呢?
首先说ajax中的jsonp实现跨域请求,在学习jsonp跨域请求前建议看一下jsonp的实现原理,http://kb.cnblogs.com/page/139725/页面代码
$.ajax({ type: "GET", //jsonp跨域请求只能是get请求 async: false, //jsonp跨域请求只能是异步请求 contentType:'application/x-javascript;charset=utf-8', url: 'http://localhsot:8080/jee/sys2/getth/path', data:{xpath:xpath,href:href,title:title}, dataType: "jsonp", jsonp:"callback",//用以获取回调函数的参数名 jsonpCallback:"jsonpCallback", //定义回调函数名称 success: function(data){ //定义了回调函数名称ajax自己处理返回的数据,传回success属性中 alert(data.tishi); },error:function(){} });
后台代码
String callback=request.getParameter("callback"); //通过参数获取到客户端的回调函数String data=callback+"({\"tishi\":\"保存成功!\"})"; //拼成回调函数加json的格式 response.setHeader("Content-type", "application/x-javascript;charset=utf-8");response.getWriter().write(data);
由于浏览器内核等限制,有事并不支持ajax的请求,所以不能使用ajax请求时我们可以使用javascript 原生的xmlhttprequest实现跨域的请求
var postpath = "path=123"; var xmlhttp = new XMLHttpRequest(); //xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 这是老版ie使用的创建xhttprequest对象的方法var URL = "http://localhsot:8080/jee/sys2/getath/path"; xmlhttp.open("POST", URL, true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send(postpath); xmlhttp.onreadystatechange = function() { if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) { var b = xmlhttp.responseText; else { } }
在js原声的跨域请求中,后台的代码中一定要设置response的head中包含(Access-Control-Allow-Origin”, “*”),Access-Control-Allow-Origin的意思为允许访问的请求来源,后面的*表示允许一切请求访问
后台代码示例
String path=request.getParameter("path");response.setHeader("Content-type", "application/x-javascript;charset=utf-8");response.setHeader("Access-Control-Allow-Origin", "*");response.getWriter().write(data);
这样使用xhttprequest的一次跨域的请求就完成了
- js原生态跨域请求与ajax中jsonp跨域请求
- Ajax跨域请求与jsonp
- Ajax跨域请求,Json与Jsonp
- ajax跨域请求jsonp
- AJAX - 跨域请求 && JSONP
- ajax跨域请求jsonp
- ajax跨域请求jsonp
- JSONP跨域请求AJAX
- Ajax跨域请求--Jsonp
- js 跨域请求jsonp
- ajax(jsonp)发送ajax跨域请求
- 利用jsonp进行ajax跨域请求
- AJAX,JSON,JSONP以及跨域请求
- ajax跨域请求--jsonp实例
- ajax 跨域请求之jsonp
- AJAX jsonp 跨域请求code
- jQuery ajax jsonp实现跨域请求
- Ajax跨域请求 JSON JSONP
- uap 开发工具无法重新授权解决方法
- Mac上的抓包工具Charles
- GeoTrust 企业(OV)型 通配符(Wildcard) SSL证书
- MySQL执行计划explain的key_len解析
- php xdebug
- js原生态跨域请求与ajax中jsonp跨域请求
- 常用的vim命令
- Winform文件下载之WinINet
- iOS开发多线程篇—线程安全
- 一般权限管理系统构思及设计
- 使用JDBC操作数据库(mysql):
- django环境配置
- STL stack堆栈容器
- ubuntu livecd isolinux的定制