【发布时间】:2012-11-07 10:17:55
【问题描述】:
我在网络开发方面是一个新手,在通过网络进行了很多挣扎之后,我找到了解决方案。 我之所以分享它,是因为我觉得它没有很好的文档记录并且可以被其他人使用,并且因为我需要一些反馈。
我想授予特定域对 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>
第二个原因是我试图设置“access-control-allow-origin”标题,而它没用。任何像这样的自定义标题都会被忽略。 实际上,服务器不需要任何那种东西,他的默认行为允许我获取调用的来源(域),我可以在过滤器中处理它,如下所示:
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”和“headers”。这两点对我来说没有意义,正如你在上面看到的,这让我最终白白浪费了很多时间!
提前感谢您的回复!
【问题讨论】:
-
如果您在 iFrame 之间进行通信并且不关心 IE6&7,您可以使用新的
postMessage()。 developer.mozilla.org/en-US/docs/DOM/window.postMessage -
String origin = hsRequest.getHeader("Origin"); if (allowedDomainList.contains(origin)) { hsResponse.setHeader("Access-Control-Allow-Origin", origin); } 其他 { 返回; }
-
以上,我自己的更正。还在测试。我不想使用 iframe,我希望外部域对他的代码 100% 负责。我只是提供服务器功能。
-
我通过抛出异常更改了“返回”,以确保它不会改变以前过滤器的行为。
-
我前几天也遇到过这个问题,我就是用我端的服务器通过HttpURLConnection向远程服务器发送请求来解决的。
标签: java jquery spring-mvc access-control