2

Tomcat サーバーではなく CDN から GWT ファイルを提供する方法を見つけようとしています。

私はこのコードから始めました

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="robots" content="no-index, no-follow" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>My Site</title>
<script type="text/javascript" src="/bcmjs/bcmjs.nocache.js"></script>
</head>

<body>
<div id="gwt_div">
</div>
</body>
</html>

そして、CDN url を使用するように JavaScript インポートを変更しました。

<script type="text/javascript" src="/bcmjs/bcmjs.nocache.js"></script>

これに:

<script type="text/javascript" src="https://uoo9w.cloudfront.net/bcmjs/bcmjs.nocache.js"></script>

フーラ!js がダウンロードされ、UIBinder ウィジェットが表示されますが、RPC は失敗します。

問題GWT.getModuleBaseは、ホスト ページ (mysite.example.com) ではなく Javascript の URL (uoo9w.cloudfront.net) を返すことで、RPC 要求に使用される URL などを壊してしまうことです。

GWT.getModuleBaseForStaticFilesCDN の使用を許可するように構築されたメソッドのようですが、それに関するドキュメントが見つかりません。 (コメント参照)

CDN からサービスを提供し、ホスト ページのドメインに RPC 要求を送信するように GWT を設定する正しい方法を知っている人はいますか?

サイドノート:

CDN はドメイン名とパスが異なるため、Same Origin Policy に関連する問題が発生するのではないかと心配していましたが、GWT ホスト ページはすべての RPC 要求と同じドメインで提供されるため、これは問題ではありません。(つまり、Window.Location は RPC と同じドメインです)

4

3 に答える 3

2

したがって、答えはServiceDefTarget.setServiceEntryPoint()すべてのRPCインターフェースを手動で呼び出すことのようです

moduleBaseURLをホスト ページの URLに置き換えるために使用したコードを次に示します。すべてのインターフェースで既存の@RemoteServiceRelativePath注釈を使用できます。RemoteService

public static native String getHostpageUrl()/*-{
   return $wnd.location.protocol + "//" + $wnd.location.host + "/";
}-*/;

GreetingServiceAsync greetingService = GWT.create(GreetingService.class);

ServiceDefTarget serviceDefTarget= ((ServiceDefTarget)greetingService);
String oldUrl = serviceDefTarget.getServiceEntryPoint();
String newServiceEntryPoint =  oldUrl.startsWith(GWT.getModuleBaseURL()) ? 
        getBaseUrl() + "module/" + oldUrl.substring(GWT.getModuleBaseURL().length(), value.length()) 
       : oldUrl;
serviceDefTarget.setServiceEntryPoint(newServiceEntryPoint);
于 2012-12-21T06:57:46.533 に答える
2

GWT は、ドキュメントの ではなく script-tagのsrc属性を指す RPC の URL を設定します。modulename.nocache.jslocation

これを修正する通常の方法は、サービスのベース URL を変更して、html ファイルのrpcを指すようにすることです。location

GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
((ServiceDefTarget)greetingService)
   .setServiceEntryPoint("http://hostname_of_your_document/modulename/greet");

注: この場合、あなたとあなたは同じホストにいるため、クロスドメインを行っていません。.htmlservices

オプションで、ファイルservicesと同じホストにない場合、 crossdomainを実行していたので、 CORSをサポートするようにサーブレットを構成できます。最善の方法は、.htmlweb.xml

<filter>
  <filter-name>corsFilter</filter-name>
  <filter-class>com.example.server.CORSFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>corsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

フィルター クラスについては、gwtquery Ajax ドキュメントで行った例を使用できます。

于 2012-12-21T08:24:03.827 に答える