一个保存数据的方法(可以切换存放的位置,可以设置密钥)

简介:       在asp.net里面一般的生命周期都比较短,如果想要比较长久的保存数据的话,一般有选择几种方式可供选择,即cookies、ViewState、Session、Cache、application等。

 

      在asp.net里面一般的生命周期都比较短,如果想要比较长久的保存数据的话,一般有选择几种方式可供选择,即cookies、ViewState、Session、Cache、application等。他们各有优缺点,也各有其自己的使用范围。

 

      我现在遇到了两个问题,第一个是如何在这几种方式里面快速、方便的切换,第二个是如何实现一个既可以区分用户,又可以区分页面,又节省服务器的资源,又比较安全的保存数据的方式。

 

      ViewState比较符合第二个问题的要求,但是他不太安全,表面上看他存放在客户端的是乱码,其实是可以解密的,解密之后就是明文了,你存放的是什么就一目了然。如果是使用ViewState保存一般的数据倒也是没有什么问题,但是我想保存的是表名、字段名、SQL语句这样的很敏感的数据,这样的数据放在ViewState里面,估计会被人骂死,呵呵。

 

      以前的QuickPager分页控件确实是这么处理的,现在越想越不安全,自己用用也就凑合了,如果推广的话,那就害人了。所以我不得不想办法来解决这个很严重的问题。于是我想写一个独立的能够保存数据的类。这个类可以使用各种方式来存放数据,如果要加密数据的话,也可以自己设置密钥,这样不知道密钥的话,就不能解密了(除非暴力破解),当然您也可以选择不加密(保存在Session、Cache就不用加密了),也可以选择不保存。

 

      这样这个类就很灵活了,使用范围也可以广泛一点。

 

      在实现这个函数的时候,遇到了两大难题,一个是如何操作隐藏域,另一个是如何“自动”保存和“自动”加载。ViewState可是不用单独调用SaveViewState()来保存数据的。

 

      在Class里面操作cookie、Session等还是比较容易的(System.Web.HttpContext.Current.Response.Cookies[ClientID]),可是如何控制隐藏域呢?想了好久也没有想到好的方法,只好用笨方法了——传递一个Page实例(System.Web.UI.Page)进来,然后使用Page.ClientScript.RegisterHiddenField(ClientID, myData) 来搞定。

 

      至于自动保存,也是采用了一个笨笨的方法,既然已经把Page传递进来了,那么就给他加一个事件吧,_page.PreRender += new EventHandler(MyPage_PreRender);在执行Render之前保存数据。我想用类似的思路来搞定自动加载数据的(_page.PreLoad += new EventHandler(MyPage_PreLoad);),但是遇到了一个小问题。我们一般都是习惯在Page_Load函数里面给属性赋值,但是我要加的事件却是在Page_Load之前执行,也就是说如果在Page_Load里面赋值的话,即使把事件加上了,那么也早已经失去了执行的机会。当然可以在OnInit里面给属性赋值,只是这么做不太符合习惯。

 

      我也研究了一下IStateManager 这个接口,也试了一下,可惜没有成功,也许是我功力不够的原因吧。

 

      Ps:这个难题解决之后,QuickPager分页控件就可以一份为二了,变成QuickPager_UI、QuickPager_SQL两个部分,再加上我的数据访问函数库和现实数据的控件,就是一套完整的分页解决方案了。

 

      QuickPager_SQL就是专门处理分页算法(也就是分页用的SQL语句)的,这些部分都可以独立使用,也可以替换成其他的控件、类库。

 

      下面是源码,源文件等整理之后和分页控件一起发送。

 

 

 

namespace  JYK.Common
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
{
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif    
枚举enum SaveViewStateLocation#region 枚举enum SaveViewStateLocation
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
/**//// <summary>
    
/// 保存数据的位置
    
/// </summary>

    public enum SaveViewStateLocation
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 不保存
        
/// </summary>

        NoSave = 1,

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 放在Cookie里面保存
        
/// </summary>

        Cookie = 2,

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 放在隐藏域里面保存
        
/// </summary>

        Hidden = 3,

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 放在Session里面保存
        
/// </summary>

        Session = 4,

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 放在Cache里面保存
        
/// </summary>

        Cache = 5,

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 放在Application里面保存
        
/// </summary>

        Application = 6

    }

    
#endregion


    
public class MyViewState        //: IStateManager
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
    {
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
成员#region 成员
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 保存数据的字典
        
/// </summary>

        private Dictionary<string, string> vs = new Dictionary<string, string>();

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 用于给表单里面添加隐藏域和加事件
        
/// </summary>

        private System.Web.UI.Page _page;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 密钥
        
/// </summary>

        private string _key = "";

        
#endregion


        
public MyViewState()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//默认设置为不保存
            SaveLocation = SaveViewStateLocation.NoSave;
        }


      
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
属性#region 属性
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 存放数据的位置
        
/// </summary>

        public SaveViewStateLocation SaveLocation;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 密钥,不同的密钥会生成不同的密文。空字符串表示不需要加密
        
/// </summary>

        public string Key
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                _key 
= value;
            }

            
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
return _key;
            }

        }


img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 保存数据的标识
        
/// </summary>

        public string ClientID = "myVS";
       
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 传递Page实例,以实现自动保存数据,和添加隐藏域的功能
        
/// </summary>

        public Page Page
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                _page 
= value;
                _page.PreLoad 
+= new EventHandler(MyPage_PreLoad);          //本来想在Page_Load之前加载内容,但是出现了一点问题
                _page.PreRender += new EventHandler(MyPage_PreRender);      //自动保存内容
            }

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get { return _page; }
        }


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
索引器,类似于ViewState的使用方式#region 索引器,类似于ViewState的使用方式
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 索引器,类似于ViewState的使用方式
        
/// </summary>
        
/// <param name="key"></param>
        
/// <returns></returns>

        public string this[string key]
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
set 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
if (vs.ContainsKey(key))
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    vs[key] 
= value; 
                }

                
else 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    vs.Add(key, value);
                }

            }

            
get 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
if (vs.ContainsKey(key))
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
return vs[key];
                }

                
else
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
return null;
                }

            }

        }

        
#endregion

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
用于自动加载和保存数据的事件#region 用于自动加载和保存数据的事件
        
void MyPage_PreRender(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            SaveViewState();
            
//throw new NotImplementedException();
        }


        
void MyPage_PreLoad(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            LoadViewState();
            
//throw new NotImplementedException();
        }

        
#endregion



img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
函数#region 函数
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 把数据保存到指定的位置里面
        
/// </summary>

        public void SaveViewState()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//拼接字符串
            System.Text.StringBuilder str = new StringBuilder(1000);
            
foreach (KeyValuePair<string,string> entry in vs)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                str.Append(entry.Key);
                str.Append(
"`");
                str.Append(entry.Value);
                str.Append(
"`");

            }


            
if (str.Length == 0)        //没有赋值
                return ;

            str.Remove(str.Length 
- 1, 1);

            
string myData =  str.ToString();

            
if (Key.Length > 0)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
//加密
                myData = Encryptor.Encrypt(myData, Key);
            }


            str.Length 
= 0;

img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif            
保存#region 保存
            
switch (SaveLocation)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
case SaveViewStateLocation.Cookie :
                    System.Web.HttpContext.Current.Response.Cookies[ClientID].Value 
= myData;
                    
break;

                
case SaveViewStateLocation.Hidden:
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif                    
#region
                    
if (Page != null)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                    
{
                        Page.ClientScript.RegisterHiddenField(ClientID, myData);
                    }

                    
#endregion

                    
break;

                
case SaveViewStateLocation.Session :
                    System.Web.HttpContext.Current.Session[ClientID] 
= myData;
                    
break;

                
case SaveViewStateLocation.Cache :
                    System.Web.HttpContext.Current.Cache[ClientID] 
= myData;
                    
break;
                
                
case SaveViewStateLocation.Application :
                    System.Web.HttpContext.Current.Application[ClientID] 
= myData;
                    
break;

            }

            
#endregion


          
        }

        
        
public void LoadViewState()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//加载
            string str = "";
            
string[] arr = null;

            
switch (SaveLocation)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
case SaveViewStateLocation.Cookie:
                    
if (System.Web.HttpContext.Current.Request.Cookies[ClientID] == null)
                        
return;
                    str 
= System.Web.HttpContext.Current.Request.Cookies[ClientID].Value;
                    
break;

                
case SaveViewStateLocation.Hidden :
                    
if (Page == null) return;
                    
if (System.Web.HttpContext.Current.Request[ClientID] == null) return;

                    str 
= System.Web.HttpContext.Current.Request[ClientID];
                    
break;

                
case SaveViewStateLocation.Session:
                    str 
= System.Web.HttpContext.Current.Session[ClientID].ToString();
                    
break;

                
case SaveViewStateLocation.Cache:
                    str 
= System.Web.HttpContext.Current.Cache[ClientID].ToString();
                    
break;

                
case SaveViewStateLocation.Application:
                    str 
= System.Web.HttpContext.Current.Application[ClientID].ToString();
                    
break;
            }


            
if (str.Length == 0)        //没有取到值
                return;

            
if (Key.Length > 0)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
//加密
                str = Encryptor.Decrypt(str, Key);
            }


            
//拆分
            arr = str.Split('`');
                  
            
//赋值
            for (int i = 0; i < arr.Length; i += 2)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                vs.Add(arr[i], arr[i 
+ 1]);
            }

        }

        
#endregion


      
    }

}

 

相关文章
|
12天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
4760 28
|
12天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4506 51
|
7天前
|
存储 弹性计算 人工智能
2026 年阿里云双十一活动入口攻略,新客服务器优惠通道、三大会场入口梳理
综合来看,2026年阿里云双十一活动入口清晰: 阿里云轻量应用服务器、阿里云ECS云服务器、阿里云GPU云服务器、阿里云百炼大模型服务平台 活动会场、综合权益中心、99计划专场三大入口覆盖服务器、AI权益与续费特价;新用户通过控制台首页banner、权益中心、产品页三处路径进入专属专场,老用户通过控制台弹窗和费用中心权益中心进入老客专区,企业用户做企业实名后解锁专属满减与阶梯折扣。
830 0
|
13天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
2174 7
|
7天前
|
云安全 人工智能 安全
|
6天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1513 3
|
4天前
|
人工智能 安全 API
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(dsh)是DeepSeek AI于2026年开源的轻量级Agent运行框架,基于Cordis内核,践行“一切皆插件”理念。支持Web/桌面双端,开箱即用;内置多模型接入、丰富插件生态(超3.5万),适配编程、办公、创作等场景。(239字)
1031 0
|
13天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2202 6
|
6天前
|
人工智能 并行计算 调度
本地 AI 一键部署工具 LocModel:Windows 端集成画图、视频生成、Agent 的开源模型运行方案
LocModel 是专为 Windows 设计的一站式本地 AI 工具,支持零配置启动、自动硬件检测、GGUF 模型一键加载、文生图/视频生成及 Agent 自动化任务。适配 8G 显存,内置显存分片调度,轻松实现 AI 漫剧批量创作与离线大模型调用。(239 字)