2016-02-17 47 views
0

大家好我有XWiki實現的istance在我的本地,用於測試目的,我想通過寫一些簡單的jQuery的腳本來測試RESTful API:XWiki實現REST Ajax調用錯誤

<script type="text/javascript"> 

var username = "Admin"; 
var password ="admin"; 

function make_base_auth(user, password) 
    { 

    var tok = user + ':' + password; 
    var hash = btoa(tok); 
    alert(hash); 
    return "Basic " + hash; 

    } 

var url = "http://localhost:8080/xwiki/rest/wikis/query?q=object:XWiki.XWikiUsers"; 
var returnData = ""; 
$.ajax({ 
    type: "GET", 
    dataType: "xml", 
    crossDomain: true, 
    async: true, 
    url: url, 
    headers: {"authorization": make_base_auth(username, password), "Access-Control-Allow-Origin": "*" }, 

    error: function(request, status, error) 
    { 
     alert(error) 
    }, 
    success: function(data) 
    { 
     alert("success"); 

    } 

     });  
</script> 

我得到的錯誤是:

XMLHttpRequest無法加載 http://localhost:8080/xwiki/rest/wikis/query?q=object:XWiki.XWikiUsers。 對預檢請求的響應未通過訪問控制檢查:否 請求的 資源上存在「訪問控制 - 允許來源」標頭。因此不允許原產地'null'訪問。

但試圖與郵遞員我得到正確的結果...我錯過了什麼? 謝謝

+0

如果你發送認證信息,它不再是一個「簡單」的請求,你需要配置XWiki(在web.xml中)來允許這些請求...你真的需要認證信息嗎? (可能是的,如果wiki不公開) –

回答

1

在默認配置XWiki不允許CORS;您需要啓用它在web.xml

要允許與authentication頭髮送的驗證數據,編輯文件web.xml,然後添加一個新的過濾器的部分中與過濾器:

<filter> 
    <filter-name>Set CORS headers very lenitent</filter-name> 
    <filter-class>org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter</filter-class> 
    <init-param> 
    <param-name>name</param-name> 
    <param-value>Access-Control-Allow-Headers</param-value> 
    </init-param> 
    <init-param> 
    <param-name>value</param-name> 
    <param-value>authorization</param-value> 
    </init-param> 
</filter> 

現在,您需要激活過濾器;在filter-mapping選自S再往下添加自己:

<filter-mapping> 
    <filter-name>Set CORS headers very lenitent</filter-name> 
    <servlet-name>RestletServlet</servlet-name> 
</filter-mapping> 

(是的,如果你不喜歡的過濾器名稱,使用不同的名稱,只在兩個地方使用相同的名稱)

由於您在評論想通了,允許幾個HTTP頭的工作原理是:

<filter> 
    <filter-name>Set CORS headers very lenitent</filter-name> 
    <filter-class>org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter</filter-class> 
    <init-param> 
    <param-name>name</param-name> 
    <param-value>Access-Control-Allow-Headers</param-value> 
    </init-param> 
    <init-param> 
    <param-name>value</param-name> 
    <param-value>authorization, content-type</param-value> 
    </init-param> 
</filter> 

(在這種情況下,允許雙方authorization頭和「非標準」 Content-Type頭)(邊注:標題是區分nsensitive: Are HTTP headers case-sensitive?

此外,您還需要允許CORS一般用於REST請求;該搜索爲:

<!-- We set the CORS policy globally for webjars. 
    ... longer comment .... 
    --> 
<filter-mapping> 
    <filter-name>Set CORS policy for fonts</filter-name> 
    <servlet-name>resourceReferenceHandler</servlet-name> 
    <url-pattern>/webjars/*</url-pattern> 
    <url-pattern>*.woff</url-pattern> 
    <url-pattern>*.eot</url-pattern> 
    <url-pattern>*.ttf</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

編輯過濾器映射,並添加一行<servlet-name>RestletServlet</servlet-name>激活該過濾器,其餘的servlet,太:

<filter-mapping> 
    <filter-name>Set CORS policy for fonts</filter-name> 
    <servlet-name>resourceReferenceHandler</servlet-name> 
    <servlet-name>RestletServlet</servlet-name> 
    <url-pattern>/webjars/*</url-pattern> 
    [...] 

servlet容器AJAX請求的重新啓動後現在應該工作。

+0

很好,但我怎麼修改xml以允許: 訪問控制允許的方法? 這是因爲嘗試一個put方法,它引發了這個錯誤 – Lorenzo

+1

可能是同樣的方法,即用' org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter添加另一個'' '​​名稱'是'訪問控制允許方法'。不知道'​​值'但是... –

+1

...可能' GET,POST,PUT,DELETE' - 更多CORS的東西,例如https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS(但肯定有更好的參考?) –