使用jmaki控件的時(shí)候,出現了跨域訪(fǎng)問(wèn)的問(wèn)題。
Author: bsspirit
Source:
http://gocom.primeton.com/blog6249_14478.htm錯誤提示是“拒絕訪(fǎng)問(wèn)” 使用jmaki控件的時(shí)候,出現了跨域訪(fǎng)問(wèn)的問(wèn)題。
<a:ajax name="dojo.table" service="http://localhost:8080/DVS/jsp/TestAction"/>
比如上面的連接,開(kāi)發(fā)的時(shí)候,一直都使用localhost進(jìn)行測試的(本機服務(wù)器),一直都沒(méi)有問(wèn)題?,F在部署到server上面。由于server需要用ip地址進(jìn)行訪(fǎng)問(wèn),寫(xiě)的絕對路徑的URL就會(huì )出現跨域訪(fǎng)問(wèn)的問(wèn)題,錯誤提示是“拒絕訪(fǎng)問(wèn)”。
<a:ajax name="dojo.table" service="http://192.1.1.1:8080/DVS/jsp/TestAction"/>。
找了一下問(wèn)題,就定位在了絕對路徑上面,改寫(xiě)成相對路徑后問(wèn)題解決。
改寫(xiě)以后的寫(xiě)法
<a:ajax name="dojo.table" service="/jsp/TestAction"/>。
其實(shí),我出現的這個(gè)問(wèn)題應該屬于javascript的同源問(wèn)題。瀏覽器出于對Javascript安全性的考慮,禁止這種不安全操作。如果所有的代碼都是同一個(gè)server提供的,客戶(hù)端從同一個(gè)server下載html,js,css等文件,屬于同一來(lái)源,就不會(huì )出現拒絕訪(fǎng)問(wèn)了。(我估計瀏覽器可能把絕對的URL當成非同源處理了)。
另外,補充一下。如果真的需要跨域訪(fǎng)問(wèn),需要用后臺的程序訪(fǎng)問(wèn)URL,然后在本項目中,在本地開(kāi)一個(gè)service給js調用。
舉例說(shuō)明一下:
Web1.war : a.js --> ServletA.java
Web2.war: b.js --> ServletB.java --> ServletA.java
通過(guò)ServletB 連接ServletA,然后b.js訪(fǎng)問(wèn)ServletB。 這樣就完成了,b.js對ServletA的訪(fǎng)問(wèn)。 (跨域訪(fǎng)問(wèn))
下面是我的測試代碼:其中b.jsp和ServletB.java是一個(gè)工程的, ServletA.java是另一個(gè)工程的。
b.jsp(b.js)
<%@ taglib prefix="a" uri="http://jmaki/v1.0/jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Page Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div id="main">
<a:widget name="dojo.table" service="/ServletB" />
</div>
</body>
</html>
----------------------------------------------------------------------------------------
ServletB.java
public class ServletA extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
response.sendRedirect("http://localhost:9080/jmaki2/ServletA");
out.flush();
out.close();
}
}
-------------------------------------------------------------------------------------------
ServletA.java
public class ServletA extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("{"rows":[{"age":13,"name":"name","pk":12},{"age":13,"name":"name","pk":12}],"columns":[{"label":"設備名稱(chēng)","id":"age"},{"label":"權屬部門(mén)","id":"name"},{"label":"設備標識碼","id":"pk"}]}");
out.flush();
out.close();
}
}
-----------------------------------------------------
另外:在網(wǎng)上找到其他兩種解決跨域的說(shuō)法
AJAX cross-domain js cross-domain 都可以解決的。。
而且不需要通過(guò)后臺。。。。google ajax cross domian ..
現在流行兩種解決方案。。。
一種是 iframe 的橋接
另一種是iframe 的代理
這兩種都沒(méi)有找到具體的實(shí)現寫(xiě)法,由于時(shí)間比較緊,我也沒(méi)有仔細研究。