用flash cookie 保存用户信息(MVC)兼容各种主流浏览器

12 篇文章 0 订阅
10 篇文章 0 订阅

最近在做一个项目,其中要用flash cookie 保存用户的信息,至于flash cookie 就不再介绍了,前面已提过

由于对as(actionscript)一点都不懂,摸索了好长时间,才写出一个简单的例子,涉及到的知识点有:

环境:window 2008 、flex builder3.0

1.as 语法

2.SharedObject 对象

3.flex 与js 通信

4.swfobject.js

我把代码贴出来,和大家分享一下(跨域的代码没测试,所以注释掉了,测试之后再来补充)

testFCookie.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
	applicationComplete="initApp()" width="500" height="500" backgroundGradientAlphas="[1.0, 1.0]">
	<mx:Script>
		<![CDATA[
			import flash.external.*;
			//js跨域访问
			//flash.system.Security.allowDomain("192.168.0.135:913", "localhost:913");
			//flash.system.Security.loadPolicyFile("crossdomain.xml");
			            
      		private var cookieFlag:String = 'cookie';     		          
      		
      		          
			//保存web项目中的值(保存flash cookie)
            public function callWrapper():String{
            	var f:String = "changeDocumentTitle";
            	var getJSValue:String="";
            	try{
            		getJSValue=ExternalInterface.call(f,"new title");
            		var cookieSharedObj:SharedObject=SharedObject.getLocal(cookieFlag);
            		cookieSharedObj.data.text=getJSValue;
            		cookieSharedObj.flush();
            	}catch(ex:Error){
            	}
            	
            	return getJSValue;
            }
            
      		//取flash cookie中的值
      		public function asFunc():String{
      			var strValue:String='';
      			var getCookieShareObj:SharedObject=SharedObject.getLocal(cookieFlag);
      			if(getCookieShareObj.size>0)
      			{
      				strValue=getCookieShareObj.data.text;
      			}
      			else
      			{
      				strValue=callWrapper();
      			}
      			return strValue;
      		}
      		
      		//返回flash cookie中的值
      		public function initApp():void {
        		//AddCallback方法允许javascript调用flash时间上函数 
          		ExternalInterface.addCallback("flexFunctionAlias", asFunc);
      		}
      		
		]]>
	</mx:Script>
</mx:Application>

index.cshtml

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <base target="_self"/>
    <title>默认程序运行后自动写入一个flash cookie</title>
    <script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="cache-control" content="no-cache"/>
    <meta http-equiv="expires" content="0"/>
    <script language="JavaScript" type="text/javascript">
        function findSWF(movieName) {
            if (navigator.appName.indexOf("Microsoft") != -1) {
                return window[movieName];
            } else {
                return document[movieName];
            }
        }
       
        //接收来自as的值
        function callApp() {
            try{
                var x = findSWF("MyFlexApp").flexFunctionAlias();
                $("#receivedBField").val(x);
                $.post("http://localhost:913/Home/Decrypt", { "fcookie": x }, function (data) {
                    $("#receivedField").val(data);
                });
            }catch(e){
                $("#receivedField").val("");
            }
        }

        //发送至as
        function changeDocumentTitle(a) {
            window.document.title = a;
            return '@ViewBag.Message'
        }
    </script>
</head>
<body style='overflow-x: hidden; overflow-y: hidden'>
    <form name="htmlForm">
    网页已自动将”flash cookie,20“这个值写入到flash cookie中
    <br />
    <br />
    取已保存的flash cookie的值:<br />
    解密前的值:<input type="text" id="receivedBField"/><br />
    解密后的值:<input type="text" id="receivedField"/>
    <input type="button" value="接收" οnclick="callApp();" /><br />
    <div id="flashcontent">
        <object id="MyFlexApp" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="100%" height="500px">
            <param name="movie" value="testFCookie.swf">
            <param name="quality" value="high">
            <param name="scale" value="noborder">
            <param name="bgcolor" value="#000000">
            <param name="wmode" value="transparent">
            <param name="allowScriptAccess" value="allways" /> 
            <embed src="testFCookie.swf" quality="high" width="100%" height="500" scale="noborder" allowscriptaccess="always"
                bgcolor="#000000" name="TH2" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
        </object>
    </div>
    </form>
</body>
</html>

HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcFlashCookie.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index()
        {
            ViewBag.Message = Common.strHelper.EncryptMD5("flash cookie,20");
            return View();
        }

        [HttpPost]
        public ContentResult  Decrypt()
        {
            string strResult = string.Empty;
            if (!string.IsNullOrEmpty(Request.Form["fcookie"]))
            {
                strResult = Common.strHelper.DecryptMD5(Request.Form["fcookie"]);
            }
            return  Content(strResult);
        }
    }
}

以上是完整的代码

经测试发现:这个例子只能在IE、360下跑。在其他浏览器中全跑不通。在网上查各种资料,结果测试一边一边的都不行,快要放弃的时候看到这样一篇文章:解决不同浏览器下各种JS与AS通信失败问题(利用swfobject开源JS工程)。他的例子没看到,我就直接查了swfobject.js的用法。改了之后,在各个浏览器(火狐、IE、360、safari、opera、谷歌)中都行了:更改的代码如下:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <base target="_self"/>
    <title>默认程序运行后自动写入一个flash cookie</title>
    <script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="cache-control" content="no-cache"/>
    <meta http-equiv="expires" content="0"/>
    <script src="../../Scripts/swfobject.js" type="text/javascript"></script>
    <script language="JavaScript" type="text/javascript">

        //接收来自as的值
        function callApp() {
            
            try{
                var x =document.getElementById("MyFlexApp").flexFunctionAlias();
                $("#receivedBField").val(x);
                $.post("http://localhost:913/Home/Decrypt", { "fcookie": x }, function (data) {
                    $("#receivedField").val(data);
                });
            }catch(e){
                $("#receivedField").val("");
            }
        }

        //发送至as
        function changeDocumentTitle(a) {
            window.document.title = a;
            return '@ViewBag.Message'
        }
    </script>
</head>
<body style='overflow-x: hidden; overflow-y: hidden'>
    <form name="htmlForm">
    网页已自动将”flash cookie,20“这个值写入到flash cookie中
    <br />
    <br />
    取已保存的flash cookie的值:<br />
    解密前的值:<input type="text" id="receivedBField"/><br />
    解密后的值:<input type="text" id="receivedField"/>
    <input type="button" value="接收" οnclick="callApp();" /><br />
    <div id="flashcontent">
    </div>
    <script type="text/javascript">
        var so = new SWFObject("testFCookie.swf", "MyFlexApp", "100%", "500", "7", "#336699");
        so.addParam("quality", "low");
        so.addParam("wmode", "transparent");
        so.addParam("salign", "t");
        so.write("flashcontent");
    </script>
    </form>
</body>
</html>

这样就顺利解决了

说明:

一、flash cookie 保存位置
谷歌flash cookie 保存的位置:
"C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default

\Pepper Data\Shockwave Flash\WritableRoot\macromedia.com\support

\flashplayer\sys\#localhost\settings.sol"

火狐、IE、360、safari、opera保存的位置:
"C:\Users\Administrator\AppData\Roaming\Macromedia\Flash Player

\#SharedObjects\RBGKDDCW\#localhost\testFCookie.swf\cookie.sol"

二、
1.IE8、IE9在删除历史记录的时候会清空flash cookie

2.谷歌21 删除历史记录的时候会清空flash cookie

 

以上是完整的代码,如果有人不想复制粘贴,有源码下载,但是要分哦:

flash cookie

我是一个初学者,从什么都不懂到琢磨出一个例子,有不足的地方 请大家见谅。也请高手指点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值