java - 在 GWT/Spring MVC 中处理 SOP - Rest

标签 java spring spring-mvc tomcat gwt

我正在实现我的 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/

相关文章:

java - 如何修复 Retrofit 中 SSL 握手超时

java - 我正在尝试删除 +911111 之类的通话记录,但它不起作用

java - 如何优化图像处理类

java - Spring Boot 应用程序中的 MySQL 数据库中没有创建表

java - 一个对象,多个 View

java - 滚烫的java --- 使用bash中的java处理stdin时出现一些奇怪的行为

java - 如何创建基于 Spring 4 注释的 channel ?

java - Spring Integration 2.2.3.RELEASE @ServiceActivator 未调用

java - 在 Spring MVC 3 中使用工厂模式实例化 bean

java - servlet.PageNotFound : No mapping found for HTTP request with URI in DispatcherServlet