Ajax跨域?qū)崿F(xiàn)代碼(后臺(tái)jsp)
AJAX 教程
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。
在應(yīng)用時(shí)主要是創(chuàng)建XMLHttpRequest對(duì)象,調(diào)用指定服務(wù)地址。
但是IE中各個(gè)版本支持的不太一樣,所以在創(chuàng)建次對(duì)象時(shí)可能要特殊處理下。
一般如下:
function createXMLHttpRequest(){
var xmlhttp;
try{
xmlhttp = new XMLHttpRequest();//ie7及以上,其他瀏覽器
}catch(e){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");//ie6
}catch(e){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//ie6以下
}catch(e){
throw "創(chuàng)建AJAX對(duì)象失??!";
}
}
}
return xmlhttp;
}
var xmlhttp = createXMLHttpRequest();
xmlhttp.open("GET","http://localhost:8080/SimpleBlog/AjaxTest",true);
xmlhttp.send(null);
xmlhttp.onreadystatechange = function(result){
if(xmlhttp.readyState==4 && xmlhttp.status == 200){
alter(result.test);
}
};
但是瀏覽器再執(zhí)行javascript代碼時(shí),有個(gè)著名的同源策略,這使得跨域請(qǐng)求就不是那么方便了。
那一般都是用什么方式支持跨域呢?
1、通過中間代理服務(wù)器,獲取要跨域請(qǐng)求的數(shù)據(jù)。
2、通過iframe內(nèi)嵌帶請(qǐng)求域的頁(yè)面,來(lái)解決跨域訪問問題。
3、通過jsonp方式。
4、不過現(xiàn)在已經(jīng)提出了XMLHttpRequest Level2(XHR2)允許跨域請(qǐng)求,不過要在server的返回頭中顯示聲明允許跨域請(qǐng)求(瀏覽器的支持情況:http://caniuse.com/#feat=xhr2)。
下面簡(jiǎn)單說下jsonp與xtr2。
jsonp:
jsonp簡(jiǎn)單的說就是利用<script>標(biāo)簽來(lái)實(shí)現(xiàn)跨域請(qǐng)求的調(diào)用,因?yàn)闉g覽器中腳本的加載是不受同源策略影響的。
function get() {
var url = 'http://localhost:8080/SimpleBlog/AjaxTest?callback=callback';
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = url;
document.body.appendChild(script);
}
function callback(va){
alert(va.test);
}
服務(wù)端(java):
boolean jsonP = false;
String cb = this.request.getParameter("callback");
if (cb != null) {
jsonP = true;
response.setContentType("text/javascript");
} else {
response.setContentType("application/x-json");
}
PrintWriter out = response.getWriter();
if (jsonP) {
try {
out.println(cb + "({\"test\":\"1\"})");
out.flush();
out.close();
} catch (Exception e) {
throw e;
}
}
這樣就可以實(shí)現(xiàn)跨域調(diào)用了。
而我們經(jīng)常用的jquery已經(jīng)實(shí)現(xiàn)了此類方式的封裝,使用起來(lái)更簡(jiǎn)單。
$(document).ready(function (){
$('#jqueryajax').bind('click', function(){
$.ajax({
type: 'get',
async: false,
url: 'http://localhost:8080/SimpleBlog/AjaxTest1',
dataType: 'jsonp',
jsonp: 'callback',
success: function(json){
alert(json.result);
},
error: function(){
alert('fail');
}
});
});
});
服務(wù)端(java):
我用了struts是這樣寫的:
public class AjaxTest1 extends ActionSupport {
private String result;
public String getResult() {
return result;
}
public String execute() {
this.result = "1";
return "jqueryajax";
}
}
配置文件:
<action name="AjaxTest1" class="AjaxTest1"> <result name="jqueryajax" type="json"> <param name="callbackParameter">callback</param> </result> </action>
下面說說xtr2:
這個(gè)就更簡(jiǎn)單了,直接創(chuàng)建調(diào)用即可。
function createCORSRequest(method,url){
var xhr=new XMLHttpRequest();
if('withCredentials' in xhr){
xhr.open(method,url,true);
}else if(typeof XDomainRequest!='undefined'){
xhr=new XDomainRequest();
xhr.open(method,url);
}else{
xhr=null;
}
return xhr;
}
function xhr2(){
var request=createCORSRequest('GET','http://localhost:8080/SimpleBlog/AjaxTest1');
if(request){
request.onload=function(){
alert(request.responseText);
}
request.onerror=function(e){
alert('error');
}
request.send();
}
}
服務(wù)端:其實(shí)只要在返回response中設(shè)置
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
即可。
- jsp用過濾器解決中文亂碼問題的方法
- 淺談jsp九大內(nèi)置對(duì)象及四個(gè)作用域
- JSP頁(yè)面跳轉(zhuǎn)方法小結(jié)
- jsp+servlet+jdbc實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查
- BootStrap在jsp中的使用
- 詳解java集成支付寶支付接口(JSP+支付寶20160912)
- JSP實(shí)現(xiàn)登錄功能之添加驗(yàn)證碼
- JSP防止網(wǎng)頁(yè)刷新重復(fù)提交數(shù)據(jù)的幾種方法
- 在JSP中如何實(shí)現(xiàn)MD5加密的方法
- JSP request.setAttribute()詳解及實(shí)例
相關(guān)文章
IE不出現(xiàn)Flash激活框的小發(fā)現(xiàn)的js實(shí)現(xiàn)方法
IE不出現(xiàn)Flash激活框的小發(fā)現(xiàn)的js實(shí)現(xiàn)方法...2007-09-09
JavaScript防抖與節(jié)流超詳細(xì)全面講解
在開發(fā)中我們經(jīng)常會(huì)遇到一些高頻操作,比如:鼠標(biāo)移動(dòng),滑動(dòng)窗口,鍵盤輸入等等,節(jié)流和防抖就是對(duì)此類事件進(jìn)行優(yōu)化,降低觸發(fā)的頻率,以達(dá)到提高性能的目的。本文就教大家如何實(shí)現(xiàn)一個(gè)讓面試官拍大腿的防抖節(jié)流函數(shù),需要的可以參考一下2022-10-10
關(guān)于javascript中的promise的用法和注意事項(xiàng)(推薦)
這篇文章主要介紹了關(guān)于javascript中的promise的用法和注意事項(xiàng),需要的朋友可以參考下2021-01-01
Javascript 實(shí)現(xiàn)放大鏡效果實(shí)例詳解
這篇文章主要介紹了Javascript 實(shí)現(xiàn)放大鏡效果實(shí)例詳解的相關(guān)資料,這里附有實(shí)現(xiàn)實(shí)例代碼,具有參考價(jià)值,需要的朋友可以參考下2016-12-12
JavaScript實(shí)現(xiàn)審核流程狀態(tài)的動(dòng)態(tài)顯示進(jìn)度條
對(duì)于有很多流程的東西,我們希望能夠根據(jù)不同的階段,用流程條對(duì)應(yīng)地進(jìn)行顯示,非常直觀,給用戶帶來(lái)極好的用戶體驗(yàn),下面小編給大家分享JavaScript實(shí)現(xiàn)審核流程狀態(tài)的動(dòng)態(tài)顯示進(jìn)度條功能,需要的的朋友參考下2017-03-03
Bootstrap模態(tài)對(duì)話框的簡(jiǎn)單使用
這篇文章主要為大家詳細(xì)介紹了Bootstrap模態(tài)對(duì)話框的簡(jiǎn)單使用,感興趣的小伙伴們可以參考一下2016-04-04

