> 文章列表 > AJAX_跨域

AJAX_跨域

AJAX_跨域

跨域(a页面来自A服务器,从a页面发送请求访问B服务器)

默认情况下ajax跨域访问会出错 

请求会被 CORS(同源策略) 阻止

同源:

协议 域名 端口 2个url的这3个要素都一致,则这2个URL同源

不安全:

如果跨域将会共享一个request对象,这是不安全的

在a(A服务器)页面发送ajax请求b访问B服务器,那么它们 的request 对象是同一个,b可以获取a的数据,a可以获取b的数据。a(恶意网站)

同源策略(浏览器的一种安全策略)

浏览器的同源策略 - Web 安全 | MDN (mozilla.org)

分布式的 服务 需要跨域访问

解决:

方案1:设置响应头,允许ajax跨域请求

JAVA 处理不同源ajax request 设置响应头

response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080"); // 允许某个
response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有

方案2:

jsonp:json with padding(带填充的json)

jsonp不是一个真正的ajax请求。只不过可以完成ajax的局部刷新效果。
- jsonp不是ajax请求,但是可以完成局部刷新的效果,并且可以解决跨域问题。
- jsonp解决跨域的时候,只支持GET请求。不支持post请求。

利用 script 标签 发送请求

响应一段 js 代码

<script>window.onload = function(){document.getElementById("#button").onclick = function(){//点击button 时 添加 一个 script 标签const htmlScript = document.createElement("script");htmlScript.type = "text/javascript";htmlScript.src = "http://localhost:8080/ajax?fun=ajax_request";document.getElementsByTagName("body")[0].appendChild(htmlScript);}}function ajax_request(s){alert(s);
}
</script>/*
添加的 script 标签
<script type="text/javascript" src="http://localhost:8080/ajax?fun=ajax_request">
</script>
*/
//后端处理 http://localhost:8080/ajax?fun=ajax_request 请求 
//获取请求参数fun的值 ajax_request(js 函数名)
//响应一段js代码(字符串) 如 fun + "(参数)"
//前端将返回的字符串作为 js 代码执行 即执行 ajax_request(参数)

方案3:

jQuery封装的jsonp

jquery发送ajax请求 dataType 设置为 jsonp

dataType: "jsonp"

 

指定 jsonp 的回调函数 

 

参数 fun=sayHello

参数名 为 jsonp:"fun" 所指定 fun,值为 jsonpCallback:"sayHello"

 

 

方案4:

代理机制(httpclient) 

ajax request 不跨域 ,由proxyServlet 去访问2号服务器,proxyServlet得到2号服务器的响应,再将得到的响应返回给前端

 Java程序怎么去发送get/post请求

第一种方案:使用JDK内置的API(java.net.URL.....),这些API是可以发送HTTP请求的。
第二种方案:使用第三方的开源组件,比如:apache的httpclient组件。(httpclient组件是开源免费的,可以直接用)
- 在java程序中,使用httpclient组件可以发送http请求。
  - 使用httpclient组件,需要先将这个组件相关的jar包引入到项目当中。