我正在尝试分离 GWT 客户端和服务器。如果我没记错的话,GWT 客户端代码通过连接到我们在 GWT 项目的 web.xml 中提到的 servlet 来获得服务器响应。如果是这样,我可以将我的 GWT Servlet 托管在一个 Tomcat 服务器中并将 GWT 客户端代码托管在另一个 Tomcat 服务器中吗?
它会工作..吗?如果是这样怎么做,我已经尝试过在 GWT 客户端文件中使用 hosts.html 的东西。但它没有奏效
我正在尝试分离 GWT 客户端和服务器。如果我没记错的话,GWT 客户端代码通过连接到我们在 GWT 项目的 web.xml 中提到的 servlet 来获得服务器响应。如果是这样,我可以将我的 GWT Servlet 托管在一个 Tomcat 服务器中并将 GWT 客户端代码托管在另一个 Tomcat 服务器中吗?
它会工作..吗?如果是这样怎么做,我已经尝试过在 GWT 客户端文件中使用 hosts.html 的东西。但它没有奏效
是的,您可以在任何网络服务器中托管客户端文件,因为它们是静态的,实际上您需要选择 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 {
}
}