在網上看到很多的JQuery跨域請求的文章,比較有意思。這裡我發表一個Servlet與JQuery配置實現跨域的代碼,供大家參考。不足之處請指教原理:JavaScript的Ajax不可以跨域,但是可以通過向本地的一個Servlet發出請求,由Servlet完成跨域。再把遠程的結構返回給客戶端。這樣A...
在網上看到很多的JQuery跨域請求的文章,比較有意思。這裡我發表一個Servlet與JQuery配置實現跨域的代碼,供大家參考。不足之處請指教
原理:JavaScript的Ajax不可以跨域,但是可以通過向本地的一個Servlet發出請求,由Servlet完成跨域。再把遠程的結構返回給客戶端。這樣Ajax就可以跨域了。在後面,再發一個PHP版本的,請大家關註啊。下麵是代碼
JS代碼:
註意:在Post方式時,param1和param2為向遠程發送的參數值,可以有多個。
1 2 3 4 5 6 7 8 9 10 11 12 |
//GET方式
function reqeustCrossDomainProxyGet(){
var url = "http://www.baidu.com" ;//遠程請求地址
var param = { 'requesturl' :url, 'typedata' : 'JSON' };
var data = getCrossDomainProxyRemote(param, "json" );
}
//Post方式
function reqeustCrossDomainProxyPost(param1,param2){
var url = apiServer+ "/api/lucene/query" ;
var param = { 'requesturl' :url, 'typedata' : 'JSON' , 'param1' :param1, 'param2' :param2};
var data = getCrossDomainProxyRemote(param, "json" );
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/**
* JS向本址的一個Servlet發送POST請求,所有關於遠程請求的參數。
* 在此處參POST方式發送給Servlet
* @param param 遠程請求參數
* @param rtype JS返回類型(暫時沒有用到)
* @return
*/
function getCrossDomainProxyRemote(param,rtype){
var url = "/cross/proxy" ; //Servlet的URL地址
var returndata;
$.ajax({
url: url,type: 'POST' ,dataType: rtype,timeout: 40000,data:param, async: false ,
error: function (response,error) {alert(response.status);},
success: function (data){returndata=data;}
});
return returndata;
}
|
Java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
public class CorssDomainProxy extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this .doPost(req, resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
boolean requestType = false ; //標記遠程請求類型,預設為GET方式
PrintWriter out = resp.getWriter();
Enumeration keys = req.getParameterNames(); //取出客戶端傳入的所有參數名
ArrayList<String> params = new ArrayList<String>();
String url= null ;
while (keys.hasMoreElements()){
String key = (String) keys.nextElement();
/**
* 如果請求參數內有如下幾種表示,這此參數不參與遠程請求
*/
if (key.equals( "requesturl" )){ //判斷參數是否是,遠程請求地址
url = req.getParameter(key);
} else if (key.equals( "typedata" )){ //判斷請求數據類型,暫時沒有用到
} else if (key.equals( "returntype" )){ //判斷請求返回類型,暫時沒有用到
} else {
params.add(key); //其它加入參數列表,此處為參與遠程請求的參數
requestType = true ; //修改標記,表求遠程請求為POST方式
}
}
HttpClient client = new HttpClient();
HttpMethod method = null ;
if (requestType){ //判斷請求方式,並實例化HttpMethod對象,true:POST,false:GET
method = new UTF8PostMethod(url);
for (String name : params){ //迭代POST參數,加入到請求中
String _value = req.getParameter(name);
((PostMethod)method).setParameter(name,_value);
}
} else {
method = new GetMethod(url);
}
client.executeMethod(method); //執行請求
String bodystr = method.getResponseBodyAsString(); //返回結果
out.println(bodystr); //將結果返回給客戶端
}
/**
* 內部類,轉換URL字元串為UTF-8
* @author Administrator
*
*/
private static class UTF8PostMethod extends PostMethod {
public UTF8PostMethod(String url) {
super (url);
}
@Override
public String getRequestCharSet() {
return "UTF-8" ;
}
}
}
|