2013-06-04 56 views
0

我有一個問題,可以調用另一個網站中另一個服務器內的JS功能。我的腳本的工作原理如下:跨域javascript函數調用?

在服務器1(IP:192.168.1.17)的頁面中有一個按鈕,可以從服務器2(IP:162.168.1.18)的頁面打開一個彈出窗口,並顯示項目列表。通過雙擊列表中的一項,頁面執行opener.setearProducto函數,檢索aString作爲參數。但在此刻,Firebug向我顯示一條消息:「錯誤:權限被拒絕訪問屬性'setearProductos'」,並且該腳本無法正常工作。 這很奇怪,因爲當我在同一臺PC上測試它時,所有工作都完美無缺。

我是谷歌搜索,並注意到需要安裝CORS。但是當我在兩臺服務器上安裝它時,腳本仍然不起作用。我也嘗試將頭文件訪問控制 - 允許來源添加到JSP文件,但也沒有工作。

我不知道問題是否與應用程序中使用的框架有關:Struts 2和Spring。

我需要幫助,因爲我不知道該怎麼做。

我附上我的web.xml如果有幫助。

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- CORS --> 
    <filter> 
    <filter-name>CORS</filter-name> 
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> 
    </filter> 
    <!-- configuraicond e Struts y Spring --> 
    <filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>sistema.cron.TareasProgramadas</listener-class> 
    </listener> 
    <listener> 
     <listener-class>sistema.base.logica.ControlServicios</listener-class> 
    </listener> 

    <!-- inicio CORS --> 
    <filter-mapping> 
     <filter-name>CORS</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <!-- inicio Struts --> 
    <filter-mapping> 
     <filter-name>struts2</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <session-config> 
     <session-timeout> 
      120 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 
+0

*當我在同一臺PC上測試它的所有作品完美*可能是因爲您的電腦被允許遠程訪問到其他服務器的資源或二者的Web應用程序部署在同一臺服務器,因此所有的權限,它們之間共享資源已啓用。 –

回答

0

我相信你已經錯過了「INIT-PARAM」設置如下

<init-param> 
      <param-name>cors.allowOrigin</param-name> 
      <param-value>http://example.com</param-value> 
    </init-param> 

找到here

原因需要到指定這是瀏覽器有一定的保護創造這樣你就不能簡單地對任何外部站點進行遠程調用。

我推薦您在HTML5Rocks: Using CORS網站上閱讀關於它的內容。簡而言之,當您向外部域發出http POST請求時,瀏覽器將首先使用某些參數進行http OPTIONS調用,服務器將使用該參數來確定是否進行調用,然後瀏覽器會將該調用用來知道它是否可以繼續進行POST請求。

+0

THX,我會嘗試 – Aegis

+0

您引用的頁面是在其他配置節道:「CORS過濾器可以在沒有額外的配置在大多數情況下運行......如果默認的公共CORS模式不能滿足您的要求,可以通過指定您自己的配置來覆蓋它。「我不知道問題是什麼,但我不認爲它缺少init-param。 – jschabs

0

從外表看來,你違反了Javascript的same-origin-policy。簡而言之:您的瀏覽器從服務器1(IP:192.168.1.17)獲取頁面,但稍後在此過程中,它希望執行駐留在服務器2(IP:192.168.1.18)中的腳本。這是一個禁止在JavaScript的土地。維基百科的文章解釋了3種方法可以放寬這個限制。

如果您決定採用Ajax方式,還有第四種選擇,並且是個人最喜歡的JSONP方式。

此外,我不明白你的意思相對於CORS當你說:

I install it in both servers

CORS是不是你安裝。這是一個HTTP擴展,其中想要違反同源策略的瀏覽器實際上告訴Web服務器(通過HTTP頭擴展Origin),它希望在由另一個Web服務器構成的頁面內執行代碼。把它放在你的場景:你的瀏覽器從服務器1打開的頁面,然後聯繫服務器2的額外代碼執行它告訴

I brought the page originally from server 1. Is it allowed by you to execute your code in his page?

和Web服務器2點的需要進行配置(無需安裝Web服務器AFAIK)關於哪些是它信任的原始服務器,哪些不是。

當一切都駐留在同一臺PC它的工作原理的原因是,原產地是兩個初始網頁和opener.setearProducto要調用額外的代碼相同。

+0

我明白了,thx。我將嘗試使用「跨文檔消息傳遞」,因爲我不需要進行ajax調用,只需將一個腳本的文本傳遞給另一個腳本 – Aegis