我正在实现我的 GWT 网络应用程序的客户端,我需要与提供 REST API 的基于 Spring 的网络服务器进行交互。我利用 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 并允许部署在不同服务器上的最佳方法是什么?谢谢。
最佳答案
设置适当的 header 服务器和客户端解决了这个问题:
服务器(CORS 过滤器):
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,Content-Type");
GWT 请求构建:
b.setHeader("Content-Type", "application/json");
关于java - 在 GWT/Spring MVC 中处理 SOP - Rest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25505486/