最近看到某公司某项目中用于保存多个城市信息到cookie中的方法,该方法的逻辑是按时间顺序记录最近访问过的三个城市的名字及id,逻辑包插入与含排重。插入与排重的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
                 获取cityid与cityname
    
                if (cityid == Utility.TypeParse.ToInt(CookieHelper.get("fwid1")))
                {
                    
                }
                else if (cityid == Utility.TypeParse.ToInt(CookieHelper.get("fwid2")))
                {
                    //CookieHelper.set("fwname3", CookieHelper.get("fwname2"), 10);
                    CookieHelper.set("fwname2", CookieHelper.get("fwname1"), 10);
                    CookieHelper.set("fwname1", HttpUtility.UrlEncode(cityname), 10);
 
                    //CookieHelper.set("fwid3", CookieHelper.get("fwid2"), 10);
                    CookieHelper.set("fwid2", CookieHelper.get("fwid1"), 10);
                    CookieHelper.set("fwid1", cityid.ToString(), 10);
                }
                else if (cityid == Utility.TypeParse.ToInt(CookieHelper.get("fwid3")))
                {
                    CookieHelper.set("fwname3", CookieHelper.get("fwname2"), 10);
                    CookieHelper.set("fwname2", CookieHelper.get("fwname1"), 10);
                    CookieHelper.set("fwname1", HttpUtility.UrlEncode(cityname), 10);
 
                    CookieHelper.set("fwid3", CookieHelper.get("fwid2"), 10);
                    CookieHelper.set("fwid2", CookieHelper.get("fwid1"), 10);
                    CookieHelper.set("fwid1", cityid.ToString(), 10);
                }
                else
                {
                    //没有相等的
                    CookieHelper.set("fwname3", CookieHelper.get("fwname2"), 10);
                    CookieHelper.set("fwname2", CookieHelper.get("fwname1"), 10);
                    CookieHelper.set("fwname1", HttpUtility.UrlEncode(cityname), 10);
 
                    CookieHelper.set("fwid3", CookieHelper.get("fwid2"), 10);
                    CookieHelper.set("fwid2", CookieHelper.get("fwid1"), 10);
                    CookieHelper.set("fwid1", cityid.ToString(), 10);
                }

点评:对于存储的中文信息需要编码,否则在部分浏览器无法存储,这是这段代码可以肯定的地方。但对于同类信息用到了六个cookie,反复的存取降低了代码的效率,最好存储在一个cookie中。另外即使考虑到数据量不大采用上面的方法,对于单个cookie最好先获取cookie中的值到一个变量当中,在需要读取cookie值的地方利用该变量即可,这样可以降低对cookie的读取次数。

看完了上面的代码,我们再来看看另外一块比较合乎规范的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
   /// <summary>
       /// 添加一对名称地址到cookie中
       /// </summary>
       /// <param name="name">地址名称</param>
       /// <param name="url">地址url</param>
       public static void AddKeyWord(string name, string url, string detailName="",int i = 0,string shortDomain)
        {
            List<KeyWord> kwLists = new List<KeyWord>();
             
            if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(url)||name.Trim().ToLower()=="null")
                return;
            HttpContext context = System.Web.HttpContext.Current;
            name = context.Server.UrlDecode(name);
            cookieName = baseCookieName + shortDomain;
            string kw = ClientCookie.Get(cookieName);
            if (name.IndexOf("%") > -1 || name.IndexOf("%") > -1)
            {
                name = context.Server.UrlDecode(name);
                if (name.IndexOf("%") > -1 || name.IndexOf("%") > -1)
                    return;
            }
            name = name.Replace(">""&gt;");
            name = name.Replace("<""&lt;");
            name = name.Replace(" ""&nbsp;");
            name = name.Replace("\"""&quot;");
            name = name.Replace("\'""'");
            name = name.Replace("\\""\\\\");//对斜线的转义
            name = name.Replace("\n""\\n");
            name = name.Replace("\r""\\r");
            if (!string.IsNullOrEmpty(kw))
            {
                try
                {
                    kwLists = JsonConvert.DeserializeObject<List<KeyWord>>(kw);
                }
                catch (Exception ex)
                {
                    LogerHelper.WriteMessegeError(kw, "解析出错");
                }
                foreach (KeyWord myKey in kwLists)
                {
                    if (name.Trim()==myKey.name.Trim()||myKey.url == url.Trim().ToLower())
                    {
                        return;
                    }
                }
                
                if (kwLists.Count >= 3)
                {
                    kwLists.RemoveAt(0);
                }
               
            }
 
            kwLists.Add(new KeyWord() { name = name.Trim(), url = url.Trim(), sort = i, detailName = detailName });
       
                ClientCookie.Set(cookieName,JsonConvert.SerializeObject(kwLists),3,shortDomain);
            
            }

点评:上面的方法将一个序列化的对象集合存储在cookie当中,可以存储更多的信息,也更加健壮。在开发过程中要不断的学习,精益求精,否则即使工作时间再长,也只是增加了干活儿的熟练程度罢了,并不能获得真正的能力提高。

本文出自 “鲲鹏击浪” 博客,请务必保留此出处http://8907792.blog.51cto.com/8897792/1837185

cookie存储对象信息的更多相关文章

  1. Redis 存储对象信息是用 Hash 还是 String

    Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value,RedisObject 中的 type,则是代表一个 value 对象具体是何种数据类型,它包含字符串(St ...

  2. 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能

    原文:利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一 ...

  3. JavaScript一个cookie存储的类

    所有输出都在浏览器的控制台中 <script type="text/javascript"> /** * cookieStorage.js * 本类实现像localSt ...

  4. js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  5. java 存储对象

    一.存储区域: 1)寄存器.这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何 ...

  6. 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)

    新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...

  7. 电影管理器之XML存储电影信息数据

    电影管理器之XML存储电影信息数据 但凡管理器之类的软件,存储数据是必不可少的.存储数据的话,有几种选择.一是用数据库,把数据存储到数据库里:一是用文本文件,把数据存储到文本文件里:一种是利用XML文 ...

  8. localstorage存储对象

    之前在客户端存储数据一直用的是cookie,由于有大小等限制,随着html5时代的到来,现在大多数用的是localstorage存储数据: 例如: localStorage.setItem(" ...

  9. 不使用cookie记录用户信息

    cookie是什么: cookie是由web服务器保存在用户浏览器(客户端)上的小文件,它可以包含用户信息,用户操作信息等等,无论何时访问服务器,只要同源,就能携带到服务端 常见方式 一般:请求一个接 ...

随机推荐

  1. 在Centos下搭建git并可以通过windows客户端访问

    亲测在本地虚拟机和远程服务器上无问题,如有不懂请留言. 注意事项:以下所有操作是在root权限下操作的.1.Centos服务器版本centos6.5 2.首先安装git,使用yum在线安装 yum i ...

  2. MySQL 优化之 ICP (index condition pushdown:索引条件下推)

    ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...

  3. windows系统路径环境变量

    当前系统盘符%systemdrive%或%HOMEDRIVE%C:\ 当前系统目录%systemroot%或%Windir%C:\WINDOWS 当前用户文件夹%UserProfile%或%HOMEP ...

  4. C 盘的不速之客

      C 盘的报告内容既然上GB的空间 操作系统版本 原来是微软这个查找解决异常关闭解决方案生成的报告   参考 How To Disable Vista Error Reporting Feature ...

  5. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  6. Princeton Algorithms week3 Assignment

    这周编程作业是实现检测点共线的算法.和排序算法有关系的地方在于,对斜率排序后可以很快的检测出来哪些点是共线的,另外这个算法的瓶颈也在于排序的性能. 一点收获: java传参数时传递的是值,这很多人都知 ...

  7. .NET面试题系列[6] - 反射

    反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ...

  8. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  9. 简单的转盘抽奖——CSS动画优化

    前言 前两天去一家公司面试,被问到一些小游戏的东西.面试官提到了刷红包还有抽奖这些怎么实现,当时简单说了下思路,回来之后想想还是说的太轻描淡写了,干说不做就是耍流氓,所以就做了一个(Demo & ...

  10. Java的异步HttpClient

    上篇提到了高性能处理的关键是异步,而我们当中许多人依旧在使用同步模式的HttpClient访问第三方Web资源,我认为原因之一是:异步的HttpClient诞生较晚,许多人不知道:另外也可能是大多数W ...