1

GWTクライアントとサーバーを分離しようとしています。私が間違っていなければ、GWTクライアントコードは、GWTプロジェクトのweb.xmlで説明したサーブレットに接続することでサーバーの応答を取得しています。もしそうなら、1つのTomcatサーバーでGWTサーブレットをホストし、他のTomcatサーバーでGWTクライアントコードをホストできますか?

それは動作しますか..?もしそうなら、それを行う方法は、私はすでにGWTクライアントファイルでhosted.htmlで動作する何かを試しました。しかし、それはうまくいきませんでした

4

2 に答える 2

1

はい、クライアントファイルは静的なものであるため、任意のWebサーバーでホストできます。実際に必要なのは、index.html、.nocache.js、およびすべての* .cache。(js | html)ファイルを選択して配置することです。それらは任意のWebサーバー(apache、nginx、iis、jettyなど)にあります。

index.htmlをphp、jspなどの他のhtmlジェネレーターに置き換えることもできます。

ただし、もちろん、サーバー側はサーブレットコンテナでホストする必要があります。

注意しなければならないのは、静的ファイルを含むサーバーがサーブレットサーバーとは異なるドメインにある場合、セキュリティ上の制約のためにajaxリクエストが失敗することです(CORSを参照)。

この制限を回避するために、gwtには多くの方法があります(gwtquery-jsonp、gwt-xdmなど)。

私が使用しているのは、オプションリクエストを受信したときにCORSを有効にできるフィルター(上記のコードを参照)です。

サーブレットコンテナのURLを正しく構成するには、クライアントコードも変更する必要があります。これは、RequestFactoryを使用してURLを変更する例です。

RFのクライアント側コード:

myFactory = GWT.create(MyRFFactory.class);
DefaultRequestTransport transport = new DefaultRequestTransport();
transport.setRequestUrl("http://my.servletcontainer.com/gwtRequest");
myFactory.initialize(eventBus, transport);

web.xml構成

   <filter>
   <filter-name>CORSFilter</filter-name>
   <filter-class>my.namespace.CORSFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>CORSFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

サーバーフィルター

public class CORSFilter implements Filter {

  public void doFilter(ServletRequest servletRequest,
      ServletResponse servletResponse, FilterChain filterChain)
      throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) servletRequest;
    HttpServletResponse resp = (HttpServletResponse) servletResponse;

    String o = req.getHeader("Origin");
    if ("options".equalsIgnoreCase(req.getMethod())) {
      resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
      if (o != null) {
        resp.addHeader("Access-Control-Allow-Origin", o);
        resp.addHeader("Access-Control-Allow-Methods", 
                       "POST, GET, OPTIONS");
        resp.addHeader("Access-Control-Allow-Headers",
                       "content-type,pageurl,x-gwt-permutation");
        resp.setContentType("text/plain");
      }
      resp.getWriter().flush();
      return;
    }

    if (o != null) {
      resp.addHeader("Access-Control-Allow-Origin", o);
    }

    if (filterChain != null) {
      filterChain.doFilter(req, resp);
    }
  }

  @Override public void destroy() {
  }

  @Override public void init(FilterConfig arg0) throws ServletException {
  }

}
于 2012-09-29T06:50:07.823 に答える
0

同じ質問が過去に尋ねられました。

gwt-split-client-and-server

できることは、モデルロジックを実装した別のサーバーへのプロキシとしてサーブレットを使用することです。

于 2012-09-28T14:00:58.290 に答える