2012-11-19 26 views
5

我是一个web开发的菜鸟,在经过很多网络挣扎后,我找到了一个解决方案。 我分享它,因为我觉得它没有很好的记录,可以被其他人使用,因为我需要一些反馈。如何使用spring和jquery设置一个真正的跨域策略

我想给特定域访问API。

首先,我尝试设置请求的标题,但由于两个原因它根本不起作用。

第一个原因是,我没有允许它的crossdomain.xml:

<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> 
      <allow-http-request-headers-from domain="domain1WithoutSlashAtTheEnd" headers="*"/> 
      <allow-http-request-headers-from domain="domain2WithoutSlashAtTheEnd" headers="*"/> 
    </cross-domain-policy> 

的第二个原因是,我试图设置“访问控制允许来源”标头,同时它也没用。任何这样的自定义标题都会被忽略。 实际上,服务器并不需要那样的东西,他的默认行为让我得到我能够处理它在过滤器中调用的原点(域)如下:

String origin = hsRequest.getHeader("Origin"); 
    if (allowedDomainList.contains(origin)) { 
     hsResponse.setHeader("Access-Control-Allow-Origin", origin); 
    } else { 
     throw new SomeException("domain not allowed"); 
    } 

其中“ allowedDomainList“是一个字符串列表,其中我给了我允许访问我的API的所有域。 它似乎工作正常。 您对此有何看法? 你是否有更具体的了解:

headers="*" 

也许只说“访问控制允许来源”。然后我看到有一个“安全”属性,我不知道该如何处理它。

我也有代码我已经有一个问题:

<!DOCTYPE cross-domain-policy 
    SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
     <cross-domain-policy> 
     <allow-access-from domain="*" /> 
     </cross-domain-policy> 

我不知道它如何与我的政策的行为地干扰。 它似乎没有影响,但crossdomain.xml对我来说很不清楚。

最后一点是关于jQuery(http://api.jquery.com/jQuery.ajax/)。为什么jQuery有一些东西来设置标题,如果我们无法在服务器端获取它们?另外,它有两种“给予”标题的方式:使用“beforeSend”和“标题”。这两点对我来说没有意义,正如你上面所看到的那样,这让我失去了很多时间,最终没有任何东西!

在此先感谢您的答复!

+1

如果你在iFrames之间进行通信而不关心IE6和7,你可以使用新的'postMessage()'。 https://developer.mozilla.org/en-US/docs/DOM/window.postMessage –

+0

String origin = hsRequest。getHeader( “源”); \t \t \t如果(allowedDomainList.contains(原点)){ \t \t \t \t hsResponse.setHeader( “访问控制允许来源”,原点); \t \t \t} else { \t \t \t \t return; \t \t \t} – user1835565

+0

以上是我自己的更正。仍在测试。 我不想使用iframe,我希望外部域对他的代码100%负责。我只是提供服务器功能。 – user1835565

回答

1

与其考虑如何允许特定域访问您的api,也许这些其他域应该以不同的方式访问您的api。

如果其他域名从web服务器而不是他们的客户端发出webrequest,则根本不必担心跨域脚本。

其他域的客户端可以发布到它自己的Web服务器,向服务器发出Web请求并将结果传递回客户端。

另外,如果您担心安全问题,有很多方法可以保护您的api,而无需维护可访问的域列表。