文档章节

解决SilverLight直接访问Java的rest服务的跨域问题

 
发布于 2016/09/02 11:40
字数 969
阅读 22
收藏 0

 

1       问题描述

SilverLight出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子域下的URL资源。

如果在SilverLight内部访问的url是另外一个站点,则会出现跨域现象。

那么,SilverLight在进行跨域访问时,首先访问的是这个站点根目录下的资源访问策略文件,如clientaccesspolicy.xml、crossdomain.xml,如果在根目录下不存在这两个文件,或者该文件中策略不允许访问,则访问出错。

2       解决办法

2.1   解决思路

SilverLight在进行跨域访问时,实际先将请求的URL进行解析,如下面URL


http://gstarwd.iteye.com/blog/564146


实际SilverLight框架先访问的是http://gstarwd.iteye.com/下面的clientaccesspolicy.xml,如果这个文件不存在,则再访问这个目录下crossdomain.xml,如果还不存在,则会出错,出现跨域问题;

如果上面两个策略文件中不允许本链接访问,则也访问出错。

 

这两个文件格式及结构样例如下:

clientaccesspolicy.xml文件样例

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from>
                <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="http://www.lishewen.com.cn/ " />
<allow-access-from domain="*.lishewen.com.cn" />
<allow-access-from domain="222.217.221.16" />
</cross-domain-policy>

这两个文件策略配置自行网上搜索,不在本文讨论范围。

 

在了解了SilverLight跨域访问的流程后,解决办法的核心思路就是:

满足SilverLight跨域访问的要求,使其在站点的根目录下访问得到clientaccesspolicy.xml或crossdomain.xml的策略内容。

2.2   办法一 通过web发布容器部署文件实现

如果rest服务通过web容器发布,如tomcat等,则将上述策略文件,放到web容器的发布根目录即可。

注意:

    需要配置合理的访问策略。

2.3   办法二 通过部署转接站点实现访问跳转

在SilverLight应用所在域内单独部署一个站点,这个站点和SilverLight是相同域,不存在跨域现象,而这个站点不属于SilverLight的,所以也能访问其他站点。

通过这个站点进行跳转而进行URL访问。

2.4   办法三 通过程序自行实现

SilverLight在进行跨域访问时,实际访问策略文件的URL是

而返回的内容实际也是这个文件的文本内容,那么,在发布rest服务的时候,顺带发布一个基于根目录的服务(/clientaccesspolicy.xml),返回String文本内容,理论上也是可行的。

http://ip:port/clientaccesspolicy.xml

下面是基于SpringMVC的一个样例,代码如下

/**
 * 解决silverlight跨域问题;
 * 在silverlight进行跨域访问时,会先访问服务的根目录下clientaccesspolicy.xml或crossdomain.xml文件,获取访问权限;
 * 这里模拟根目录下有此文件进行文本返回。
 * 
 * @return
 */
@RequestMapping(value = {"/clientaccesspolicy.xml"}, method={RequestMethod.GET,RequestMethod.POST})
public String clientaccesspolicy () {
	StringBuilder info = new StringBuilder();
	info.append("<?xml version='1.0' encoding='utf-8'?>")
		.append("<access-policy>")
		.append("<cross-domain-access>")
		.append("<policy>")
		.append("<allow-from>")
		.append("<domain uri='*'/>")
		.append("</allow-from>")
		.append("<grant-to>")
		.append("<resource path='/' include-subpaths='true'/>")
		.append("</grant-to>")
		.append("</policy>")
		.append("</cross-domain-access>")
		.append("</access-policy>");
	return info.toString();
}

如上方法,这个方法的访问路径是“/clientaccesspolicy.xml”,允许get、post方式访问,返回的结果是一个拼接的xml内容,这个内容实际是策略文件clientaccesspolicy.xml的内容。

3       结果验证

这里主要是基于方法三的验证

3.1   浏览器访问策略文件效果

以gaia应用发布的rest服务为例,浏览器访问的URL地址是

http://localhost:8080/clientaccesspolicy.xml

得到的返回结果为

3.2   SilverLight程序访问实际rest应用跟踪

SilverLight程序访问的URL如下

http://localhost:8080/gaia/service/rest/rulecheck

用工具跟踪实际访问流程如下,说明策略访问成功后跳转到实际rest服务地址

 

© 著作权归作者所有

粉丝 0
博文 8
码字总数 10458
作品 0
朝阳
私信 提问
Angular 应用解决跨域访问的问题

在前后台分离的应用中,Angular 与 Java 是一对好搭档。但是如果是分开部署应用,则势必会遇到跨域访问的问题。 什么是跨域 启动应用之后,有些浏览器会提示如下告警信息: 这个是典型的跨域...

waylau
2018/12/21
0
0
elasticsearch mac下安装使用 java环境的安装

安装java环境 JAVA现在有8u201与8u202两个版本,这两个版本有什么区别呢? 这是官方对于奇数版本与偶数版本区别的解释: 从JDK版本7u71以后,JAVA将会在同一时间发布两个版本的JDK,其中: ...

李佳顺
03/04
0
0
Silverlight应用整合

在企业应用系统中,企业客户不在满足于呆板的Portal、树形结构、数据堆积的表格和满屏的文字描述。企业客户越来越倡导用户体 验,Silverlight迎合了这种需求,实现了炫目的体验和丰富交互的应...

墙头草
2011/05/03
0
0
java B2B2C 多级分销多租户电子商城系统-单点登录(SSO)简介

单点登录SSO(Single Sign-On)是身份管理中的一部分。 SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即 通过一个应用中的安全验证...

it菲菲
04/12
0
0
springboot系列六 cors跨域支持

CORS理解 cors的请求类型 来自 CORS简介(作者 loveis715) 简单请求(Simple Request) 预检请求(Preflighted Request) 带凭证的请求(Requests with Credential) springboot的cors支持 场景 代码...

yimingkeji
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 吾不好梦中插人

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @鱼豆腐233 :#今日歌曲分享# 分享My Chemical Romance的单曲《I Don't Love You》: 《I Don't Love You》- My Chemical Romance 手机党少年们...

小小编辑
47分钟前
17
4
ss5 vpn 安装(linux版本)

1. 创建一个文件夹 /ss5 你也可以自定义,不过后续的地方需要注意自己的地址 2. 下载ss5文件(如果你的服务器没有安装wget请使用 yum -y install wget 命令安装 如果连yum都没安装自己查去)(下...

太黑_thj
今天
2
0
八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
5
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
3
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部