ajax
Asynchronous JavaScript And Xml
异步的js交互技术
根据浏览器的规范,在默认情况下,为了防止XSS、CSRF攻击,XMLHTTPRequest是不可以跨域的。
同源策略
由于浏览器同源策略的限制,非同源下的请求,都会产生跨域问题。
同源策略即:同一协议,同一域名,同一端口号。当其中一个不满足时,我们的请求即会发生跨域问题。
这个问题只有ajax会出现,script标签的src还是img标签的src,或者说link标签的href他们没有被同源策略所限制。
格式一 (不跨域)
一般都是get请求
$.ajax({
type:"get",
url:"localhost:8080//xxx?usrname="+$("xx").val(),
success:function(data){
data.s.forEach(function(item){
$("#list").append($("<li>"+item+"</li>"));
})
}
})
格式二 (跨域)
$.ajax({
url:"http://suggestion.baidu.com/su?wd="+$(this).val(),
dataType:"jsonp",
jsonp:"cb",
success:function(data){
data.s.forEach(function(item){
$("#list").append($("<li>"+item+"</li>"));
})
}
})
通过dataType选项还可以指定其他不同数据处理方式。除了单纯的XML,还可以指定 html、json、jsonp、script或者text。其中,text和xml类型返回的数据不会经过处理。数据仅仅简单的将XMLHttpRequest的responseText或responseHTML属性传递给success回调函数。
如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。
解决跨域的第二个方案
CORS
当发送ajax请求时,服务器会返回一个响应头,
第三个方案
服务器转发
在服务器端向第三方服务器发起请求,得到数据,并返回给客户端,对于前端来说是不存在跨域的。
如果用Servlet来实现,需要HttpClient对象。