我有一个应用程序,其中包含创建为WAR(GWT
应用程序)的UI代码和分别部署在两个不同域(EAR
)中的服务器端代码8080,9090
。在从8080
到9090
进行通信时,它会发送请求,甚至我可以看到它返回响应200
。但是客户端抛出了一些GWT
异常**拒绝访问属性'文档'的权限**。下图显示了火灾中引发的异常。
注意:我在服务器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来处理这个异常。有什么建议吗?
答案 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);
}
}