Aug
14
当门户网站频道过多的时候,并且绑定的是不同的二级子域。
这个时候就会发现,JS在整站中跨域的问题很让人恼火。
到处都是无权限。
我们会想到用iframe的方式来调用页面来实现跨域,但是那很麻烦很麻烦,而且还不好控制。
JQ中不是有跨域的解决方案吗?
NO!那个也麻烦。
flash本身就有跨域的方案,本身加入System.security.allowDomain("*");
然后写一个跨域规则的crossdomain.xml即可。
flash跨域类这么写:
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.external.ExternalInterface;
import flash.system.Security;
public class FlashProxy extends Sprite{
private var _params:Object;
private var _loader:URLLoader;
private var _method:String;
private var _id:String;
private var _parse:Boolean;
private var _inited:Boolean;
private var _data:String;
private var _xml:XML;
public function FlashProxy(){
Security.allowDomain('*');
_inited = false;
_data = "";
_parse = true;
_method = URLRequestMethod.POST;
_loader = new URLLoader();
configureListeners(_loader);
}
public function load(page:String,params:Object=null):void{
if(!_inited){
showError("FlashProxy还没有初始化!");
}
if(page == null || page == undefined){
showError("page参数为必须的!");
return;
}
var vars:URLVariables = new URLVariables();
vars.tmp = Math.random();
if(params != null){
for(var key in params){
if(key == "tmp"){
continue;
}
vars[key] = params[key];
}
}
_loader.dataFormat = URLLoaderDataFormat.TEXT;
var request:URLRequest = new URLRequest(page);
request.method = _method;
request.data = vars;
_loader.load(request);
}
public function setParse(value:Boolean):void{
_parse = value;
}
public function setMethod(value:String):void{
if(value == null || value == undefined){
return;
}
value = StringUtil.trim(value);
if(value.toLocaleUpperCase() == URLRequestMethod.POST || value.toLocaleUpperCase() == URLRequestMethod.GET){
_method = value.toLocaleUpperCase();
}
}
public function getData():String{
return _data;
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, completeHandler);
dispatcher.addEventListener(Event.OPEN, openHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}
private function completeHandler(event:Event):void {
_data = _loader.data;
if(_parse){
try{
_xml = new XML(_data);
}catch(error:Error){
_parse = false;
_xml = null;
Tracer.debug("xml解析错误!");
}
}
ExternalInterface.call(_id+".onComplete");
}
private function openHandler(event:Event):void {
ExternalInterface.call(_id+".onOpen");
}
private function progressHandler(event:ProgressEvent):void {
ExternalInterface.call(_id+".onProgress",event.bytesLoaded,event.bytesTotal);
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
showError("读取失败!\n 不能跨域访问,可能是你在web服务端根目录下没有放置crossdomain.xml文件!");
}
private function httpStatusHandler(event:HTTPStatusEvent):void {
showError("读取失败!\n HTTP错误代码为:"+event.status);
}
private function ioErrorHandler(event:IOErrorEvent):void {
showError("读取失败!\n 可能是因为下列原因:\n 1.网络忙,请稍候重试!\n 2.访问的web服务端没有开启!");
}
public function alert(msg:String):void{
navigateToURL(new URLRequest(msg));
}
public function showError(msg:String):void{
ExternalInterface.call(_id+".onError",msg);
}
}
}
当然,这个是较简单的一个跨域类。
APMServ的作者在其博客上也发了一个JS通过FLASH来跨域的方案,很全面。
参考地址是:
这个时候就会发现,JS在整站中跨域的问题很让人恼火。
到处都是无权限。
我们会想到用iframe的方式来调用页面来实现跨域,但是那很麻烦很麻烦,而且还不好控制。
JQ中不是有跨域的解决方案吗?
NO!那个也麻烦。
flash本身就有跨域的方案,本身加入System.security.allowDomain("*");
然后写一个跨域规则的crossdomain.xml即可。
flash跨域类这么写:
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.external.ExternalInterface;
import flash.system.Security;
public class FlashProxy extends Sprite{
private var _params:Object;
private var _loader:URLLoader;
private var _method:String;
private var _id:String;
private var _parse:Boolean;
private var _inited:Boolean;
private var _data:String;
private var _xml:XML;
public function FlashProxy(){
Security.allowDomain('*');
_inited = false;
_data = "";
_parse = true;
_method = URLRequestMethod.POST;
_loader = new URLLoader();
configureListeners(_loader);
}
public function load(page:String,params:Object=null):void{
if(!_inited){
showError("FlashProxy还没有初始化!");
}
if(page == null || page == undefined){
showError("page参数为必须的!");
return;
}
var vars:URLVariables = new URLVariables();
vars.tmp = Math.random();
if(params != null){
for(var key in params){
if(key == "tmp"){
continue;
}
vars[key] = params[key];
}
}
_loader.dataFormat = URLLoaderDataFormat.TEXT;
var request:URLRequest = new URLRequest(page);
request.method = _method;
request.data = vars;
_loader.load(request);
}
public function setParse(value:Boolean):void{
_parse = value;
}
public function setMethod(value:String):void{
if(value == null || value == undefined){
return;
}
value = StringUtil.trim(value);
if(value.toLocaleUpperCase() == URLRequestMethod.POST || value.toLocaleUpperCase() == URLRequestMethod.GET){
_method = value.toLocaleUpperCase();
}
}
public function getData():String{
return _data;
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, completeHandler);
dispatcher.addEventListener(Event.OPEN, openHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}
private function completeHandler(event:Event):void {
_data = _loader.data;
if(_parse){
try{
_xml = new XML(_data);
}catch(error:Error){
_parse = false;
_xml = null;
Tracer.debug("xml解析错误!");
}
}
ExternalInterface.call(_id+".onComplete");
}
private function openHandler(event:Event):void {
ExternalInterface.call(_id+".onOpen");
}
private function progressHandler(event:ProgressEvent):void {
ExternalInterface.call(_id+".onProgress",event.bytesLoaded,event.bytesTotal);
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
showError("读取失败!\n 不能跨域访问,可能是你在web服务端根目录下没有放置crossdomain.xml文件!");
}
private function httpStatusHandler(event:HTTPStatusEvent):void {
showError("读取失败!\n HTTP错误代码为:"+event.status);
}
private function ioErrorHandler(event:IOErrorEvent):void {
showError("读取失败!\n 可能是因为下列原因:\n 1.网络忙,请稍候重试!\n 2.访问的web服务端没有开启!");
}
public function alert(msg:String):void{
navigateToURL(new URLRequest(msg));
}
public function showError(msg:String):void{
ExternalInterface.call(_id+".onError",msg);
}
}
}
当然,这个是较简单的一个跨域类。
APMServ的作者在其博客上也发了一个JS通过FLASH来跨域的方案,很全面。
参考地址是:
引用
http://blog.s135.com/ajaxcdr/



JS与FLASH这对冤家
一个JQ的缓动菜单效果
