zoukankan      html  css  js  c++  java
  • asp.net状态保持相关知识总结

    注意网站与项目的区别
        多了命名空间 预编译
    编码格式已响应报文为主 response.Charset="gb2312";

    无状态(对象销毁 连接断开)
    ///////////////////////////////
    viewstate 客户端 使用 一个页面使用 隐藏域自动保存值 有run="server"
    禁用viewstate状态(位置可以选择 页头page指令夹为全部) EnableViewState=“false” 可以用()工具进行状态检测
    保存非单值元素 非表单元素状态
     ViewState["num"] = num;(保存值)
     ----图片的序列和反序列化
     ----using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    --- //定义一个变量向页面传值
            protected string str="" ;
            //页面加载
            protected void Page_Load(object sender, EventArgs e)
            {
                //首次加载
                if (!IsPostBack)
                {
                    //图片保存到隐藏域中调用序列化方法
                    str = ImgToString();
                }
                //提交时
                else
                {
                    string s = Request.Form["hd"];
                    //调用反序列化方法形成图片
                    System.Drawing.Image img = StrToImg(s);
                    Response.ContentType = "image/jpeg";
                    //保存图片
                    img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }

            private System.Drawing.Image StrToImg(string s)
            {
                //base64解码
                byte[] buffer = Convert.FromBase64String(s);
                //反序列化
                using (MemoryStream ms = new MemoryStream(buffer))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    System.Drawing.Image img = bf.Deserialize(ms) as System.Drawing.Image;
                    return img;
                }
            }

            private string ImgToString()
            {
                //获取对象的路径
                string path = Request.MapPath("img/IMG_4692.jpg");
                //创建图片
                System.Drawing.Image img = System.Drawing.Image.FromFile(path);
                using (MemoryStream ms = new MemoryStream())
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    //把图片转化为流
                    bf.Serialize(ms, img);
                    //序列化后的对象 写入字节数组
                    byte[] buffer = ms.ToArray();
                    //把字节数组,base64编码转换成字符串
                    return Convert.ToBase64String(buffer);
                }
            }
    ------------------------------------------------------------------------------------
    cookie也是保存客户端 和域名相关 和浏览器相关 数据最好加密
        把少量数据保存在客户端的内存或硬盘并读取出来的一种技术  cookie位置C:useradmincookie
        存在硬盘时会设置cookie的时间 反之在内存上
        1、普通get请求无cookie 可以通过监视观察报文
        2、服务器通过响应报文头里的set-cookie向浏览器设置cookie信息
        3、浏览器通过请求报文里头的cookie传递浏览器存储的cookie信息
        常用于登录和保存最近浏览的商品 cookie.Expires=datetime.now.addminutes(5) 设置cookie的保存时间
        1、cookie的读写
        //在内存中创建对象
         HttpCookie hc = new HttpCookie("test");
                hc.Value = DateTime.Now.ToString();
                //设置过期时间
                hc.Expires = DateTime.Now.AddDays(5);
                //输出 (并没有真正输出)
                Response.Cookies.Add(hc);
                //读cookie
                HttpCookie hc=Request.Cookies["test"];
                if (hc != null)
                {
                    Response.Write(hc.Value);
                }
        2、cookie的删除
                context.Response.ContentType = "text/plain";
                //所有的cookie
                int count = context.Request.Cookies.Count;
                //遍历cookie
                for (int i = 0; i < count; i++)
                {
                    HttpCookie hc=context.Request.Cookies[i];
                    //设置过期
                    hc.Expires = DateTime.Now.AddDays(-1);
                    context.Response.Cookies.Add(hc);
                }
                //页面跳转
                context.Response.Redirect("Login.aspx");
            }
            页面登录使用cookie
            <登陆页>if (IsPostBack)
                {
                //接收传值
                    string name = Request.Form["txtName"];
                    string pwd = Request.Form["txtPwd"];
                    //判断
                    if (name == "user" && pwd == "user")
                    {
                        //创建cookie对象
                        HttpCookie hc = new HttpCookie("name");
                        hc.Value = name;//赋值 设置销毁时间
                        hc.Expires = DateTime.Now.AddDays(7);
                        //添加到集合
                        Response.Cookies.Add(hc);
                        //页面跳转
                        Response.Redirect("06-LoginOver.aspx");
                    }
                }
                else
                {
                    //页面第一次加载
                    if (Request.Cookies["name"] != null)
                    {
                        s = Request.Cookies["name"].Value;
                    }
                }
            <登陆跳转页>
            if (Request.Cookies["test"] != null)
                {
                    Response.Write("欢迎" + Request.Cookies["test"].Value.ToString());
                }
            问题: 输出同名cookie浏览器会重新赋值 反之添加
            设置cookie的路径hc.Path="/文件"(根目录下的文件)
            cookie.Domain(域/域名)
    ------------------------------------------------------------------------------------
    session服务端保存客户端的数据
            在一般处理程序中必须实现接口IRequiresSessionState 添加system.web.sessionstate空间
            session["name"]="";赋值  string str=session["name"].tostring();取值
            销毁session.Abandon(); 对象并没有从池里销毁  Session.Clear();清空对象里的键值对
            页面登录使用session  sessionId 用cookie保存在浏览器的缓存内了
            <页面登录>
            //点击提交
                if (IsPostBack)
                {
                    string code = Request.Form["txtCode"].ToLower();
                    //判断验证码是否正确
                    //因为session有过期机制,所以先判断是否为null
                    if (Session["code"] !=null && code == Session["code"].ToString().ToLower())
                    {
                        //当验证码正确,移除
                        Session.Remove("code");

                        string name = Request.Form["txtName"];
                        string pwd = Request.Form["txtPwd"];
                        if (name == "admin" && pwd == "admin")
                        {
                            //记录登录成功的状态
                            Session["user"] = name;
                            Response.Redirect("08-LoginOver.aspx");
                        }
                    }
                    else
                    {
                        Response.Write("验证码错误");
                    }
                }
            <登陆跳转页>
                 //判断是否登录
                if (Session["user"] == null)
                {
                 
                   
                    Response.Write("<script>alert('请登录');location.href='08-Login.aspx'</script>");
                }
                else
                {
                    Response.Write(Session.SessionID);
                    Response.Write("欢迎"+Session["user"].ToString());
                }
    -------验证码
        <%@ WebHandler Language="C#" class="ValidateCode" %>

    using System;
    using System.Web;
    using System.Drawing;
    using System.Web.SessionState;
    public class ValidateCode : IHttpHandler,IRequiresSessionState {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "image/jpeg";

            string code = GetRndStr();
            //保存在session上
            context.Session["code"] = code;
            using (Bitmap img = CreateImages(code, "ch"))
            {
                img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
        /// <summary>
        /// 数字随机数
        /// </summary>
        /// <returns></returns>
        private string GetRndNum()
        {
            string code = string.Empty;
            Random random = new Random();
            for (int i = 0; i < 4; i++)
            {
                code += random.Next(9);
            }
            return code;
        }
        /// <summary>
        ///  英文随机
        /// </summary>
        /// <returns></returns>
        private string GetRndStr()
        {
            string Vchar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
            string[] VcArray = Vchar.Split(',');
            string checkCode = string.Empty;
            Random rand = new Random();
            for (int i = 0; i < 4; i++)
            {
                int t = rand.Next(VcArray.Length);
                checkCode += VcArray[t];
            }
            return checkCode;
        }
        /// <summary>
        /// 中文随机
        /// </summary>
        /// <returns></returns>
        private string GetRndCh()
        {
            System.Text.Encoding gb = System.Text.Encoding.Default;//获取GB2312编码页(表)
            object[] bytes = CreateRegionCode(4);//生4个随机中文汉字编码
            string[] str = new string[4];
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < 4; i++)
            {
                //根据汉字编码的字节数组解码出中文汉字
                str[i] = gb.GetString((byte[])Convert.ChangeType(bytes[i], typeof(byte[])));
                sb.Append(str[i].ToString());
            }
            return sb.ToString();
        }
        /// <summary>
        /// 产生随机中文字符
        /// </summary>
        /// <param name="strlength"></param>
        /// <returns></returns>
        private static object[] CreateRegionCode(int strlength)
        {
            //定义一个字符串数组储存汉字编码的组成元素
            string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
            Random rnd = new Random();
            object[] bytes = new object[strlength];

            for (int i = 0; i < strlength; i++)
            {
                //区位码第1位
                int r1 = rnd.Next(11, 14);
                string str_r1 = rBase[r1].Trim();
                //区位码第2位
                rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);
                int r2;
                if (r1 == 13)
                {
                    r2 = rnd.Next(0, 7);
                }
                else
                {
                    r2 = rnd.Next(0, 16);
                }
                string str_r2 = rBase[r2].Trim();

                //区位码第3位
                rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机种子
                int r3 = rnd.Next(10, 16);
                string str_r3 = rBase[r3].Trim();

                //区位码第4位
                rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
                int r4;
                if (r3 == 10)
                {
                    r4 = rnd.Next(1, 16);
                }
                else if (r3 == 15)
                {
                    r4 = rnd.Next(0, 15);
                }
                else
                {
                    r4 = rnd.Next(0, 16);
                }
                string str_r4 = rBase[r4].Trim();
                //定义两个字节变量存储产生的随机汉字区位码
                byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
                byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);

                //将两个字节变量存储在字节数组中
                byte[] str_r = new byte[] { byte1, byte2 };

                //将产生的一个汉字的字节数组放入object数组中
                bytes.SetValue(str_r, i);
            }
            return bytes;
        }
        /// <summary>
        /// 画图片的背景图+干扰线
        /// </summary>
        /// <param name="checkCode"></param>
        /// <returns></returns>
        private Bitmap CreateImages(string checkCode, string type)
        {
            int step = 0;
            if (type == "ch")
            {
                step = 5;//中文字符,边界值做大
            }
            int iwidth = (int)(checkCode.Length * (13 + step));
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 22);
            Graphics g = Graphics.FromImage(image);
            g.Clear(Color.White);//清除背景色
            Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };//定义随机颜色
            string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
            Random rand = new Random();

            for (int i = 0; i < 50; i++)
            {
                int x1 = rand.Next(image.Width);
                int x2 = rand.Next(image.Width);
                int y1 = rand.Next(image.Height);
                int y2 = rand.Next(image.Height);
                g.DrawLine(new Pen(Color.LightGray, 1), x1, y1, x2, y2);//根据坐标画线
            }

            for (int i = 0; i < checkCode.Length; i++)
            {
                int cindex = rand.Next(7);
                int findex = rand.Next(5);

                Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
                Brush b = new System.Drawing.SolidBrush(c[cindex]);
                int ii = 4;
                if ((i + 1) % 2 == 0)
                {
                    ii = 2;
                }
                g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * (12 + step)), ii);

            }
            g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            return image;
        }
    <img onclick="this.src='ValidateCode.ashx?_='+Math.random()" title="看不清?" style="cursor:pointer" src="ValidateCode.ashx" /><input type="text" name="txtCode" /><br />
    onclick="this.src='ValidateCode.ashx?_='+Math.random()"鼠标点击随机生成
    ------------------------------------------------------------------------------------
    application服务端保存共享数据
            应用--当前在线人数
            session时间设定 <sessionState timeout="1"></sessionState>web.config
            新建一个全局处理程序
             protected void Application_Start(object sender, EventArgs e)
            {
                Application.Lock();
                Application["count"] = 0;
                Application.UnLock();
            }

            protected void Session_Start(object sender, EventArgs e)
            {
                Application.Lock();
                Application["count"] = Convert.ToInt32(Application["count"]) + 1;
                Application.UnLock();
            }

            protected void Application_BeginRequest(object sender, EventArgs e)
            {

            }

            protected void Application_AuthenticateRequest(object sender, EventArgs e)
            {

            }

            protected void Application_Error(object sender, EventArgs e)
            {

            }

            protected void Session_End(object sender, EventArgs e)
            {
                Application.Lock();
                Application["count"] = Convert.ToInt32(Application["count"]) - 1;
                Application.UnLock();
            }

            protected void Application_End(object sender, EventArgs e)
            {

            }

  • 相关阅读:
    ld: library not found for -lstdc++.6
    WebViewJavascriptBridge 进行js 与native通信。
    invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    OC 与 js 界面JSBridge交互
    react-native init的时候出现问题:npm WARN React-native@0.35.0 requires a peer of react@~15.3.1 but none was
    react-无状态组件
    2018年末--积极拥抱h5.转载 大前端时代来临,我们何去何从?
    /Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc
    EXCEL中如何获得工作表(sheet)的名称
    DELPHI中Showmodal与Show的区别
  • 原文地址:https://www.cnblogs.com/eric-gms/p/3464885.html
Copyright © 2011-2022 走看看