2016-03-22 7 views
1

カスタムレストエンドポイントに「Access-Control-Allow-Origin」を設定していますが、このwebserviceをjavascriptから呼び出すと、次のエラーがMarkLogicカスタムレストエンドポイントセットアクセス制御 - 許可 - プリフライト要求の起点

XMLHttpRequest cannot load http://10.239.12.22:8042/LATEST/resources/repoUIFacet?rs:q=TNF. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://gprulcd707873.abbvienet.com:8000' is therefore not allowed access. The response had HTTP status code 401. 

私はレスポンスヘッダIは、OPTIONS要求に対する応答ヘッダーを設定するにはどうすればよい

(: Function responding to GET method - must use local name 'get':) 
declare function repoUIFacet:get($context as map:map, $params as map:map) as document-node()* 
{ 
    let $output-types := map:put($context,"output-types","application/json") 

    let $_ := xdmp:add-response-header("Access-Control-Allow-Origin", "*") 
    ... 
}; 

を設定するコードですか?

答えて

2

エラーメッセージは、The response had HTTP status code 401で終了します。これは、アクセス制御ヘッダーではなく、認証に関する問題です。資格情報を送信するか、アプリケーションサーバーをアプリケーションレベルの認証に切り替える必要があります。

HTH!

+0

Iプリフライトエラーが発生しました... CORSリクエストです。 – Ravi

+0

いいえ、プリフライトリクエストで認証失敗が発生したと思います。 MarkLogicへのリクエストはすべて、通常は認証される必要があるため、プリフライトリクエストも必要です。あなたの答えの中にプロキシや中間層を置くことは、そのような認証チェックをバイパスする良い解決策です。 – grtjn

2

最近、同様の問題が発生しました。ブラウザからリクエストを発行すると、ブラウザはMarkLogicにOPTIONSリクエストを送信します。しかし私のルータはapi_keyをチェックし、存在しなければ40倍のコードで応答しました。

apiキーをチェックする前に、着信するメソッドがOPTIONSであるときはいつでも、200コードでレスペンドしていました。他のすべてのメソッドは、APIをチェックし、適切な応答コードを返します。

xqueryルーターを使用している場合は、次のように試してみてください。

let $method := fn:lower-case(xdmp:get-request-method()) 

(: Intercept OPTIONS method and respond immediately :) 
if ($methods = 'options') then 
    xdmp:set-response-code(200, 'OK') 
else (: 
    invoke the endpoint function "$method", e.g. repoUIFacet:get 
:) 

幸運を祈る!

+0

私はMarkLOGICのカスタムrest-apiのためにOPTIONSを見ませんでした。私はrewriter.xmlを見ていました。 OPTIONSのリクエストをディスパッチしないでください。しかし、私はラッパーを書くのではなく、apacheサーバーでマークロジックの残りのapiを前面に出し、ApacheでCORSを設定することができました。 – Ravi

2

MarkLogicのカスタムrest-apiの前にカスタムWebサービス層を書く代わりに、私がやったことは次のとおりです。
私は基本的にカスタムMarklogicエンドポイントのプロキシとして機能するApacheサーバーを持っています。次にCORSヘッダーを設定します。また、OPTIONS要求をキャッチして200を送信します。リクエストにAuthorizationがあるときに通知します。 「*」Access-Control-Allow-Origin *、動作しません..あなたは、私は、次の正規表現を置くの回避策を行った。..ホストを指定する必要がありますが、私は私のApache設定や.htaccessファイルでそれを行う方法です

<IfModule mod_headers.c> 
    SetEnvIf Origin "^http(s)?://(.+\.)?(YOUR_DOMAIN.com)(:[0-9]+)?$" origin_is=$0 
    Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is 
    Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS" 
    Header always set Access-Control-Max-Age "1000" 
    Header always set Access-Control-Allow-Headers "X-Requested-With, content-type, Access-Control-Allow-Origin, Authorization, X-User-Id" 
    </IfModule> 

    RewriteEngine on 
    RewriteCond %{REQUEST_METHOD} OPTIONS 
    RewriteRule ^(.*)$ $1 [R=200,L] 

    ProxyPass /cr_dev http://10.239.12.22:8042/LATEST/resources 
    ProxyPassReverse /cr_dev/ http://10.239.12.22:8042/LATEST/resources 
関連する問題