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包引入到项目当中。