1

かなり単純ですが、GWT-RPC (Async-Interface) と組み合わせて gwt のクロスサイト スクリプティング メカニズムを使用する GWT アプリケーションに問題があります。

問題は、ブラウザが OPTIONS コマンドのみを RPC-Backend に送信し、POST を送信していないことです。したがって、データがサーバーに到達することはありません。これは、クライアント サーバー通信のキャプチャです。

GWT クライアントから

OPTIONS /contact/contact/dispatchService HTTP/1.1
Host: svr3.dmz.mycompany.com:8380
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.mycompany.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Access-Control-Request-Headers: x-gwt-module-base, x-gwt-permutation, origin, content-type
Accept: */*
Referer: http://www.mycompany.com/contact.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

サーバーから

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: POST, TRACE, OPTIONS
Content-Length: 0
Date: Tue, 23 Apr 2013 07:13:06 GMT

しかし、POST 経由で送信されるデータはありません。

私のmodule.gwt.xmlには、xs-Linkerを使用するための次の行があります。

<inherits name="com.google.gwt.core.Core" />
<add-linker name="xs" />

残念ながら、同じ結果で xsiframe も試しました。

クロスサイトスクリプティングなしで同じサーバーから GWT-Application を直接呼び出すと、すべて正常に動作します。

POST /contact/contact/dispatchService HTTP/1.1
Host: svr3.dmz.mycompany.com:8380
Connection: keep-alive
Content-Length: 273
X-GWT-Module-Base: http://svr3.dmz.mycompany.com:8380/contact/contact/
X-GWT-Permutation: 5BE2BF501B916E292DCA5282B8B896AE
Origin: http://svr3.dmz.mycompany.com:8380
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Content-Type: text/x-gwt-rpc; charset=UTF-8
Accept: */*
Referer: http://svr3.dmz.mycompany.com:8380/contact/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __utma=179080955.1318578617.1360141977.1366109245.1366612633.29; __utmc=179080955; __utmz=179080955.1366104741.27.5.utmcsr=www.mycompany.com|utmccn=(referral)|utmcmd=referral|utmcct=/index.html

サーバーから

7|0|9|http://svr3.dmz.mycompany.com:8380/contact/contact/|C4C9C36F0F0B498822C3C822496B3301|com.mycompany.contact.client.DispatchService|dispatch|com.mycompany.contact.client.DispatchService$Message/2078545930||lastname@mycompany.com|Direct via 
svr3.|givenname|1|2|3|4|1|5|5|6|7|8|9|6|HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment
Content-Type: application/json;charset=utf-8
Content-Length: 12
Date: Tue, 23 Apr 2013 07:15:44 GMT

//OK[[],0,7]

Web アプリケーションは、mod_jk 経由で接続された Apache2 の背後にある Tomcat6 で実行されています。

この問題を解決する方法はありますか?

4

2 に答える 2

2

これはプリフライト リクエストと呼ばれ、クロス オリジン リクエストを実行するときにブラウザによって作成されます(従来の理由によるいくつかの例外があります)。最初に Web アプリケーションが POST を許可されているかどうかをサーバーに確認します。

OPTIONSサーバー側でリクエストを処理し、適切なAccess-Control-Allow-Originヘッダー (および場合によってAccess-Control-Max-AgeAccess-Control-Allow-Headers、 など)で応答する必要があります。

http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0を参照してください。

これは (明らかに) CORS をサポートするブラウザーでのみ機能することに注意してください。これにより、多くの人が除外されます (IE は IE10 以降の CORS のみをサポートし、残念ながらまだ主流ではありません): http://caniuse.com/cors https : //developers.google.com/web-toolkit/doc/latest/FAQ_Server#SOP,_GWT,_and_XMLHTTPRequest_Calls

リンカーを使用するとxs(ところで、xsiframe最近はリンカーを使用する必要があります。ドキュメントは少し古くなっています)、スクリプトの読み込みのみが修正され、サーバーへの要求はカバーされません。RPC サービスが実際に展開されているサーバーにリクエストをルーティングする HTML ホスト ページと同じオリジンで、プロキシ(サーブレット、スクリプト、サーバー構成など) を使用できます。https://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideRPCDeploymentを参照してください

于 2013-04-23T08:48:10.353 に答える
0

Thomas Broyer からの情報に基づいて、CORS-Support-Filter を追加することで問題を解決できました。

まず、これを pom.xml に追加しました。

    <dependency>
        <groupId>com.thetransactioncompany</groupId>
        <artifactId>cors-filter</artifactId>
        <version>1.3.2</version>
    </dependency>

次に、これを私のweb.xmlに追加しました:

<filter>
    <!-- The CORS filter with parameters -->
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>

    <!-- Note: All parameters are options, if ommitted CORS Filter
         will fall back to the respective default values.
      -->
    <init-param>
        <param-name>cors.allowGenericHttpRequests</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>

    <init-param>
        <param-name>cors.allowSubdomains</param-name>
        <param-value>false</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportedMethods</param-name>
        <param-value>GET, HEAD, POST, OPTIONS</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportedHeaders</param-name>
        <param-value>Content-Type, X-Requested-With, x-gwt-module-base, x-gwt-permutation, origin</param-value>
    </init-param>

    <init-param>
        <param-name>cors.exposedHeaders</param-name>
        <param-value>X-Test-1, X-Test-2</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>cors.maxAge</param-name>
        <param-value>3600</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

フィルターについて詳しくはこちらをご覧ください。

注意:さらに、このソリューションを IE 8 でテストしましたが、残念ながら、予想どおりIE 8 では動作しません。最近のバージョンではテストしていませんが、IE 8 はまだ普及しているため、mod_jk を介して同じオリジン Web サイトに rpc サーブレットを含める必要があります。

于 2013-04-23T13:39:01.203 に答える