跨域请求(一)

原文链接: https://www.mk2048.com/blog/blog.php?id=h02chbjci21j&title=%E8%B7%A8%E5%9F%9F%E8%AF%B7%E6%B1%82%28%E4%B8%80%29

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

猜你喜欢

转载自blog.csdn.net/qq_29069777/article/details/102760294