在GWT中部署在两个不同域中的应用程序之间的交互

时间:2016-03-03 07:03:09

标签: javascript java gwt cors

我有一个应用程序,其中包含创建为WAR(GWT应用程序)的UI代码和分别部署在两个不同域(EAR)中的服务器端代码8080,9090。在从80809090进行通信时,它会发送请求,甚至我可以看到它返回响应200。但是客户端抛出了一些GWT异常**拒绝访问属性'文档'的权限**。下图显示了火灾中引发的异常。

enter image description here

注意:我在服务器9090中启用了CORS,请参阅服务器端代码EAR中添加的以下代码

@Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {

        HttpServletRequest request=(HttpServletRequest) arg0;
        HttpServletResponse response=(HttpServletResponse) arg1;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        arg2.doFilter(request, response);
    }

有没有想到我需要添加GWT客户端UI来处理这个异常。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

看来,您尝试在不同的域/端口上发出t请求?即使你试图“欺骗”它,它也无法在所有浏览器中运行(它不会是跨浏览器),因为CORS是HTML5附带的新解决方案。 也许您应该考虑使用REST协议在客户端和服务器之间进行通信? 当我不得不在从UI到服务器的不同域上下文之间进行通信时,我遇到了这样的问题,唯一的方法就是使用AJAX GWT-RPC服务。跨浏览器解决方案

如果您仍想坚持打破SOP并应用CORS,请尝试根据本文更改过滤器:https://code.google.com/archive/p/gwtquery/wikis/Ajax.wiki

像这样:

REST

不要忘记正确配置过滤器:

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

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

String origin = req.getHeader("Origin");
if (origin != null && origin.matches(ALLOWED_DOMAINS_REGEXP)) {
  resp.addHeader("Access-Control-Allow-Origin", origin);
  if ("options".equalsIgnoreCase(req.getMethod())) {
    resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
    if (origin != null) {
      String headers = req.getHeader("Access-Control-Request-Headers");
      String method = req.getHeader("Access-Control-Request-Method");
      resp.addHeader("Access-Control-Allow-Methods", method);
      resp.addHeader("Access-Control-Allow-Headers", headers);
      // optional, only needed if you want to allow cookies.
      resp.addHeader("Access-Control-Allow-Credentials", "true");
      resp.setContentType("text/plain");
    }
    resp.getWriter().flush();
    return;
  }
}

// Fix ios6 caching post requests
if ("post".equalsIgnoreCase(req.getMethod())) {
  resp.addHeader("Cache-Control", "no-cache");
}

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

}