是的,您可以在任何网络服务器中托管客户端文件,因为它们是静态文件,实际上您需要选择 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 {
}
}