1

我正在尝试分离 GWT 客户端和服务器。如果我没记错的话,GWT 客户端代码通过连接到我们在 GWT 项目的 web.xml 中提到的 servlet 来获得服务器响应。如果是这样,我可以将我的 GWT Servlet 托管在一个 Tomcat 服务器中并将 GWT 客户端代码托管在另一个 Tomcat 服务器中吗?

它会工作..吗?如果是这样怎么做,我已经尝试过在 GWT 客户端文件中使用 hosts.html 的东西。但它没有奏效

4

2 回答 2

1

是的,您可以在任何网络服务器中托管客户端文件,因为它们是静态的,实际上您需要选择 index.html、.nocache.js 和所有 *.cache.(js|html) 文件并放入它们在任何 Web 服务器(apache、nginx、iis、jetty 等)中。

您甚至可以用任何其他 html 生成器(如 php、jsp 等)替换 index.html。

当然,服务器端应该托管在一个 servlet 容器中。

您必须注意的是,当带有您的静态文件的服务器与 servlet 服务器位于不同的域中时,ajax 请求将由于安全限制而失败(请参阅 CORS)。

为了避免这种限制,gwt 中有很多方法(gwtquery-jsonp、gwt-xdm 等)。

我正在使用的是一个过滤器(参见上面的代码),它能够在收到选项请求时启用 CORS。

您还必须修改客户端代码以正确配置 servlet-container 的 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-拆分客户端和服务器

您可以做的是使用 servlet 作为另一个服务器的代理,您已经在其中实现了模型逻辑。

于 2012-09-28T14:00:58.290 回答