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

问题描述:

我有一个应用程序,它包含分别部署在两个不同域(8080,9090)中的作为WAR(GWT应用程序)和服务器端代码创建的UI代码EAR。当从80809090沟通时,它发送一个请求,甚至我可以看到它返回的响应200。但客户端正在抛出一些GWT异常**拒绝访问属性“文档”**的权限。下图显示了fire bug中抛出的异常。部署在GWT中两个不同域中的应用程序之间的交互

enter image description here

注:我已经启用了CORS服务器9090看到服务器端代码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

使用'的postMessage()',你不能捅到其他域上的窗口的DOM,无论CORS设置... – dandavis

+0

感谢d andavis ..在哪里使用这个postMessage()?战争和耳朵部署在不同的域 –

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

如果你想仍然坚持打破SOP和应用CORS尝试根据这篇文章改变你的过滤器:https://code.google.com/archive/p/gwtquery/wikis/Ajax.wiki

像这样:

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); 
} 

} 

而且不要忘了配置过滤器正确:

<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> 
+0

感谢您的回复mlewandowski ..我会尝试这.. –

+0

仍然我在Firefox中得到相同的异常..但在铬它抛出此异常未捕获的com.google.gwt.event.shared .UmbrellaException:发生异常:(TypeError) __gwt $例外::无法读取属性'indexOf'为null ..任何建议 –

+0

IE怎么样?标记我的答案,如果有帮助:) – mlewandowski