0

こんにちは、ローカルホストに xwiki のインスタンスがあります。テスト目的で、簡単な jquery スクリプトを記述して RESTful API をテストしたかったのです。

<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 を読み込めません。プリフライト要求への応答がアクセス制御チェックに合格しません: 要求されたリソースに 'Access-Control-Allow-Origin' ヘッダーが存在しません。したがって、オリジン 'null' へのアクセスは許可されません。

しかし、郵便配達員を試してみると、正しい結果が得られます...何か不足していますか? ありがとう

4

2 に答える 2

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>

ここで、フィルターを有効にする必要があります。s のさらに下filter-mappingに、独自の追加を行います。

<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ヘッダーの両方を許可します) (補足: ヘッダーは大文字と小文字を区別しません: HTTP ヘッダーは大文字と小文字を区別しますか? )

また、REST リクエストに対して一般的に CORS を許可する必要があります。この検索の場合:

<!-- 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>

filter-mapping を編集<servlet-name>RestletServlet</servlet-name>し、残りのサーブレットに対してもこのフィルターをアクティブにする行を追加します。

<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>
  [...]

サーブレット コンテナーを再起動すると、AJAX 要求が機能するようになります。

于 2016-02-22T15:45:46.233 に答える