GWT与XS。没有帖子,只有选择。取消加载

GWT与XS。没有帖子,只有选择。取消加载,gwt,post,xss,rpc,cors,Gwt,Post,Xss,Rpc,Cors,我对GWT应用程序有一个问题,该应用程序相当简单,但使用GWT的跨站点脚本机制和GWT-RPC异步接口 问题是,浏览器只向RPC后端发送OPTIONS命令,而不发送POST命令。因此,数据永远不会到达服务器。这是客户端-服务器通信的捕获: 来自GWT客户端 OPTIONS /contact/contact/dispatchService HTTP/1.1 Host: svr3.dmz.mycompany.com:8380 Connection: keep-alive Access-Control

我对GWT应用程序有一个问题,该应用程序相当简单,但使用GWT的跨站点脚本机制和GWT-RPC异步接口

问题是,浏览器只向RPC后端发送OPTIONS命令,而不发送POST命令。因此,数据永远不会到达服务器。这是客户端-服务器通信的捕获:

来自GWT客户端

OPTIONS /contact/contact/dispatchService HTTP/1.1
Host: svr3.dmz.mycompany.com:8380
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.mycompany.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Access-Control-Request-Headers: x-gwt-module-base, x-gwt-permutation, origin, content-type
Accept: */*
Referer: http://www.mycompany.com/contact.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
从服务器

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: POST, TRACE, OPTIONS
Content-Length: 0
Date: Tue, 23 Apr 2013 07:13:06 GMT
7|0|9|http://svr3.dmz.mycompany.com:8380/contact/contact/|C4C9C36F0F0B498822C3C822496B3301|com.mycompany.contact.client.DispatchService|dispatch|com.mycompany.contact.client.DispatchService$Message/2078545930||lastname@mycompany.com|Direct via 
svr3.|givenname|1|2|3|4|1|5|5|6|7|8|9|6|HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment
Content-Type: application/json;charset=utf-8
Content-Length: 12
Date: Tue, 23 Apr 2013 07:15:44 GMT

//OK[[],0,7]
但是没有数据是通过邮政发送的

在我的module.gwt.xml中,我有以下一行代码用于使用xs链接器:

<inherits name="com.google.gwt.core.Core" />
<add-linker name="xs" />
从服务器

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: POST, TRACE, OPTIONS
Content-Length: 0
Date: Tue, 23 Apr 2013 07:13:06 GMT
7|0|9|http://svr3.dmz.mycompany.com:8380/contact/contact/|C4C9C36F0F0B498822C3C822496B3301|com.mycompany.contact.client.DispatchService|dispatch|com.mycompany.contact.client.DispatchService$Message/2078545930||lastname@mycompany.com|Direct via 
svr3.|givenname|1|2|3|4|1|5|5|6|7|8|9|6|HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment
Content-Type: application/json;charset=utf-8
Content-Length: 12
Date: Tue, 23 Apr 2013 07:15:44 GMT

//OK[[],0,7]
Web应用程序在Tomcat6上运行,在Apache2后面通过mod_jk连接

你知道我该如何解决这个问题吗?

这被称为飞行前请求,是由浏览器在执行跨源请求时发出的,出于遗留原因,有几个例外情况是,首先与服务器检查是否允许webapp发布

您必须在服务器端处理选项请求,并使用适当的访问控制允许原始标头和可能的访问控制最大年龄、访问控制允许标头等进行响应

请注意,这显然只适用于支持CORS的浏览器,这排除了很多人IE只支持从IE10开始的CORS,不幸的是还不是主流: 另见


使用xs链接器顺便说一句,你现在应该更喜欢xsiframe链接器,文档有点过时了,只是修复了脚本的加载,它不包括对服务器的请求。您可以使用代理servlet、脚本、服务器配置,无论它们与将请求路由到实际部署RPC服务的服务器的HTML主机页位于同一来源上;请参见

根据Thomas Broyer提供的信息,我通过添加CORS支持过滤器解决了该问题:

首先,我在pom.xml中添加了以下内容:

    <dependency>
        <groupId>com.thetransactioncompany</groupId>
        <artifactId>cors-filter</artifactId>
        <version>1.3.2</version>
    </dependency>
然后将以下内容添加到my web.xml:

<filter>
    <!-- The CORS filter with parameters -->
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>

    <!-- Note: All parameters are options, if ommitted CORS Filter
         will fall back to the respective default values.
      -->
    <init-param>
        <param-name>cors.allowGenericHttpRequests</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>

    <init-param>
        <param-name>cors.allowSubdomains</param-name>
        <param-value>false</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportedMethods</param-name>
        <param-value>GET, HEAD, POST, OPTIONS</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportedHeaders</param-name>
        <param-value>Content-Type, X-Requested-With, x-gwt-module-base, x-gwt-permutation, origin</param-value>
    </init-param>

    <init-param>
        <param-name>cors.exposedHeaders</param-name>
        <param-value>X-Test-1, X-Test-2</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>cors.maxAge</param-name>
        <param-value>3600</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
有关筛选器的更多信息,请参阅


警告:此外,我已经用IE8测试了这个解决方案,不幸的是,正如预期的那样,它不能与IE8一起工作。我还没有用最新的版本测试过它,但由于IE8仍然处于流行状态,我必须通过mod_jk将rpc servlet包含到同一来源的网站中。

谢谢托马斯!我已经有了这样的印象,XS特性是相当危险的。因此,我将使用modßjk将gwt应用程序与整个页面的其余部分包含在同一个源代码中。难道现在modßproxy不应该比modßjk更受欢迎吗?据Tomcat提交者Peter Roßbach说,modßjk仍然是最好的选择,因为它可以很好地处理会话粘性等。至少这是去年我和他最后一次谈话时的状态。现在更多地使用mod_proxy是因为:1。它适用于任何后端,而不仅仅是java,2。对于任何JavaServlet容器,都有没有mod_jk实现的服务器,3。某些服务器(如jetty)建议使用http over ajp或jk以及4。apache系统管理员的趋势是使用mod_代理。不过我知道,在某些情况下,只有当您使用tomcat时,jk才能提供更高的性能。