部署在GWT中两个不同域中的应用程序之间的交互
我有一个应用程序,它包含分别部署在两个不同域(8080,9090
)中的作为WAR(GWT
应用程序)和服务器端代码创建的UI代码EAR
。当从8080
到9090
沟通时,它发送一个请求,甚至我可以看到它返回的响应200
。但客户端正在抛出一些GWT
异常**拒绝访问属性“文档”**的权限。下图显示了fire bug中抛出的异常。部署在GWT中两个不同域中的应用程序之间的交互
注:我已经启用了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添加处理这个例外。任何建议?
看来,您试图在不同的域/端口上提出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>
感谢您的回复mlewandowski ..我会尝试这.. –
仍然我在Firefox中得到相同的异常..但在铬它抛出此异常未捕获的com.google.gwt.event.shared .UmbrellaException:发生异常:(TypeError) __gwt $例外:
IE怎么样?标记我的答案,如果有帮助:) – mlewandowski
使用'的postMessage()',你不能捅到其他域上的窗口的DOM,无论CORS设置... – dandavis
感谢d andavis ..在哪里使用这个postMessage()?战争和耳朵部署在不同的域 –