【问题标题】:Dealing with SOP in GWT/Spring MVC - Rest在 GWT/Spring MVC 中处理 SOP - Rest
【发布时间】: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


【解决方案1】:

设置适当的标头服务器和客户端解决了这个问题:

服务器(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");

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 2015-09-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2021-09-06
    • 2016-12-30
    相关资源
    最近更新 更多