转载地址:
http://blog.youkuaiyun.com/liumm0000/article/details/8443550
无论是Silverlight还是Flex都要解决跨域访问问题,这样设计就是为了安全。
如果为了安全可以指定那个跨域到那个服务器上,如果在外网上切记。
此文档适用于Silverlight/Flex+IIS/Tomcat等架构模式。
若允许Tomcat所有域访问,将clientaccesspolicy.xml和crossdomain.xml加入%TOMCAT_HOME%\webapps\ROOT 目录下即可
clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
crossdomain.xml
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
再看看微软:
使服务跨域边界可用
使用 Silverlight 版本 4 进行跨域通信需要预防几种类型的安全漏洞,它们可被用于违法利用 Web 应用程序。“跨站点伪造”(Cross-site forgery) 作为一种利用手段,在允许跨域调用时会成为威胁。此利用手段包括在用户不知情的情况下向第三方服务传输未授权命令的恶意 Silverlight 控件。为了避免跨站点请求伪造,对于除图像和媒体之外的其他所有请求,Silverlight 在默认情况下只允许源站点通信。例如,在 http://contoso.com/mycontrol.aspx 上承载的 Silverlight 控件默认只能访问同一域中的服务(例如 http://contoso.com/service.svc),而不能访问位于 http://fabrikam.com/service.svc 的服务。这可以避免在 http://contoso.com 域上承载的恶意 Silverlight 控件对 http://fabrikam.com 域上承载的服务调用未授权操作。
若要允许 Silverlight 控件访问其他域上的服务,该服务必须明确选择允许跨域访问。通过选择,服务声明它公开的操作可以由 Silverlight 控件安全地调用,而不会对该服务存储的数据造成具有潜在危害的结果。
Silverlight 4 支持两种不同的机制供服务选择跨域访问:
- 在承载服务的域的根目录中放置一个 clientaccesspolicy.xml 文件,以配置服务允许跨域访问。
- 在承载服务的域的根目录中放置一个有效的 crossdomain.xml 文件。该文件必须将整个域标记为 public。Silverlight 支持 crossdomain.xml 架构的一个子集。
有关跨域访问的更多信息,请参见 Silverlight 2 中的网络安全访问限制。
使用 clientaccesspolicy.xml 文件来允许跨域访问
-
构建允许 Silverlight 客户端访问的服务。有关如何执行此操作的更多信息,请参见如何:为 Silverlight 客户端生成服务。
-
创建允许访问该服务的 clientaccesspolicy.xml 文件。以下配置允许从任何其他域访问当前域上的所有资源。
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="SOAPAction"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
或者,如果只允许从其他域中的一个进行访问(例如 http://contoso.com),则将上面 clientaccesspolicy.xml 文件的
<allow-from>
元素内的<domain uri="*"/>
行替换为<domain uri="http://contoso.com"/>
行。若允许从任何通过 HTTP 应用程序承载的 Silverlight 控件访问 HTTPS 服务,则需要将
<domain uri=”http://*” />
元素放入<allow-from>
元素。标头特性的有效值包括:
- 通配符 (“*”) - 允许所有未列入黑名单的标头
- 允许标头的逗号分隔列表。这些允许的标头可以使用通配符后缀,例如,“X-CUSTOM-*”。
若允许通过 TCP 套接字访问服务,则将
<socket-resource port="4502" protocol="tcp" />
添加到<grant-to>
元素,其中 4502 是承载服务的端口值。 - 通配符 (“*”) - 允许所有未列入黑名单的标头
-
将 clientaccesspolicy.xml 文件保存到承载该服务的域的根目录中。例如,如果该服务在 http://fabrikam.com 上承载,则文件必须位于 http://fabrikam.com/clientaccesspolicy.xml。
-
通过从其他域调用服务来测试是否已启用访问。
使用 crossdomain.xml 文件来允许跨域访问
-
构建允许 Silverlight 客户端访问的服务。有关如何进行此操作的更多信息,请参见如何:为 Silverlight 客户端生成服务。
-
创建包含以下配置的 crossdomain.xml 文件。必须将该文件配置为允许从任何其他域访问服务,否则 Silverlight 4 将无法识别它。
-
将 crossdomain.xml 文件保存在承载服务的域的根目录中。例如,如果该服务在 http://fabrikam.com 上承载,则该文件必须位于 http://fabrikam.com/crossdomain.xml。
-
通过从其他域调用服务来测试是否已允许访问该服务。
1,首先,创建crossdomain.xml文件,里面的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd" >
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
<allow-access-from domain="*" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
2,把这个文件拷贝到webapps的目录下和webapps/ROOT目录下面。
CORS介绍 它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全。 而W3C的官方文档目前还是工作草案,但是正在朝着W3C推荐的方向前进。 简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的。 Tomcat下的配置 下载cors-filter-1.7.jar,java-property-utils-1.9.jar这两个库文件,放到lib目录下。(可在 http://search.maven.org上查询并下载。)工程项目(如:geoserver)中web.xml中的配置如下: <filter> <filter-name>CORS</filter-name> <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> <init-param> <param-name>cors.allowOrigin</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.supportedMethods</param-name> <param-value>GET, POST, HEAD, PUT, DELETE</param-value> </init-param> <init-param> <param-name>cors.supportedHeaders</param-name> <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value> </init-param> <init-param> <param-name>cors.exposedHeaders</param-name> <param-value>Set-Cookie</param-value> </init-param> <init-param> <param-name>cors.supportsCredentials</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CORS</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |