1.cors 跨域资源共享
cors是W3C标准,可以通过XMLHttpRequest 解除ajax的同源使用限制。
1.1基本使用
前台请求和正常ajax请求没有任何区别,浏览器发现是跨域请求则会在请求头中增加 “Origin” 请求头
Origin:http://localhost:8080
cors的实现主要是后台提供接口Access-Control-Allow-Origin
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
// * 代表接受任意域的请求
response.setHeader("Access-Control-Allow-Origin", "*");
1.2发送Cookie
如果要发送Cookie则后台需要设置Access-Control-Allow-Credentials响应头
response.setHeader("Access-Control-Allow-Credentials", "true");
前台js则需要设置XMLHttpRequest对象的withCredentials属性
var xhr = new XMLHttpRequest();
xhr.open("POST","http://localhost:8090/javascriptDemo/CrosDemo",true);
xhr.withCredentials = true;
不过这个请求中的Cookie是8090域中的Cookie,并不是8080的,另外如果要发送Cookie那么“Access-Control-Allow-Origin”必须设置成指定的域,不能使用“*”
原网页也没有办法通过document.cookie访问到服务器域下的Cookie
2.JSONP
JSONP是英文JSON with Padding的缩写,是一个非官方的协议。它允许在服务器端生成script tags返回至客户端,通过javascript callback的形式来实现站点访问。 JSONP是一种script tag的注入,将server返回的response添加到页面实现特定功能。
个人理解:前台将回调函数传递给后台,服务端直接返回可执行的JavaScript函数调用
前台代码:
<script src="http://localhost:8090/javascriptDemo/CrosDemo?jsonp=test"></script>
后台代码:
response.setContentType("text/javascript");
PrintWriter out = response.getWriter();
String callBack = (String) request.getParameter("jsonp");
Map map = new HashMap();
map.put("name", "test");
map.put("id", "12");
JSONObject jsonObj = JSONObject.fromObject(map);
out.print(callBack "(" jsonObj ")");
out.close();
更多专业前端知识,请上 【猿2048】www.mk2048.com