【发布时间】:2014-08-26 12:09:01
【问题描述】:
我正在实现我的 GWT webapp 的客户端,我需要与一个提供 REST API 的基于 Spring 的 web 服务器进行交互。我利用 DTO 模式通过 GET 和 POST 进行通信。当我在同一个 Tomcat 实例上部署 GWT 客户端和 Spring 服务器时,一切正常。如果我将它们部署在两个实例上,我会得到 HTTP 状态 0,这是应用 SOP 的标志。
在服务器上,我实现并设置了一个 CORS 过滤器:
@Component
public class SimpleCORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {
}
public void destroy() {
}
}
在我放的 web.xml 中:
<filter>
<filter-name>simpleCORSFilter</filter-name>
<filter-class>com.lh.clte.web.util.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>simpleCORSFilter</filter-name>
<servlet-name>rest</servlet-name>
</filter-mapping>
在 GWT 方面,我以这种方式构建请求:
protected void sendPost(String url, DTO dto,
RequestCallback callback) {
RequestBuilder b = new RequestBuilder(RequestBuilder.POST, url);
String data = stringify(dto);
b.setHeader("Content-Type", "application/json");
b.setHeader("Access-Control-Allow-Origin", "*");
b.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE");
b.setHeader("Access-Control-Max-Age", "3600");
b.setHeader("Access-Control-Allow-Headers", "x-requested-with");
b.setRequestData(data);
b.setCallback(callback);
try {
b.send();
} catch (RequestException e) {
e.printStackTrace();
}
}
public native String stringify(JavaScriptObject jso) /*-{
return JSON.stringify(jso);
}-*/;
鉴于这一切,我可以调整应用程序以应对 SOP 并允许在不同服务器上部署的最佳方式是什么?谢谢。
【问题讨论】:
-
为什么要在请求中设置
Access-Control-Allow标头?同样Content-Type也没有在响应头中设置Access-Control-Allow-Headers
标签: java spring spring-mvc tomcat gwt