【问题标题】:GWT Client files in one Server & GWT Servlets in other Server一台服务器中的 GWT 客户端文件和另一台服务器中的 GWT Servlet
【发布时间】:2012-09-29 14:50:07
【问题描述】:

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

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

【问题讨论】:

    标签: gwt


    【解决方案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 {
      }
    
    }
    

    【讨论】:

    • 本例中的 eventBus 是什么?我想做类似的事情,这个示例代码可能正是我正在寻找的。​​span>
    • 请求工厂(RF)需要一个 gwt 事件总线实例才能工作,通常它由所有 gwt 应用程序共享,这就是 RF 初始化需要它的原因。在这种情况下 EventBus eventBus = new SimpleEventBus();
    【解决方案2】:

    过去也有人问过同样的问题。

    gwt-split-client-and-server

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

    【讨论】:

    • 抱歉,我在发布此问题之前检查了其他 stackoverflow 帖子,但没有弹出。还是谢谢
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多