zoukankan      html  css  js  c++  java
  • 初识Session,Cookie一则简单的登陆

    无状态http                                                                                 

    一个浏览者发出的请求通常都是由实现了IhttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕后对象可能已经销毁了,写的类变量值早已经不存在了,因此了不要把状态信息保存到变量当中.浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议.

    客户端的状态保持方案:ViewState、隐藏域、Cookies、控件状态、URL查询参数

    服务端的状态保持方案:Session(会话)、Application、Caching(缓存)、DataBase(数据库)

    Cookie                                                                                     

    Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。
    l当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。
    如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。Cookie不兼容浏览器!(不同浏览器不共享Cookie文件数据)
    cookie的简单操作
    l服务器设置Cookie:

       HttpCookie cok = new HttpCookie(“uId”, “10001”);//(“键”,”值”)

       cok.Expires = DateTime.Now.AddDays(18);//设置失效日期-现在之后的18天后

       context.Response.Cookies.Add(cok); //添加到响应中

     
    服务器获得客户端传来的Cookie:

         string strUName=context.Request.Cookies[“uId”].Value;//从请求中获得Cookie

    cookie的一些注意点

    l表单是和页面相关的,只有浏览器端提交了这些数据,服务器端才能得到。而有时候希望在服务端任意的地方存取一些和访问者相关的信息,这时候就不方便将这些信息保存到表单中了,因为如果那样的话必须随时注意在所有页面表单中都保存这些信息。Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新到硬盘,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以。
    l哪怕请求jpg、js、css这种文件也会带着Cookie,因为服务器端可能要进行Session的操作,比如判断是否登录。互联网优化的案例:图片服务器和主站域名不一样,降低Cookie流量的传输。面试时聊网站调优
    Cookie的缺点和表单一样,而且还不能存储过多信息。客户端、服务器端设置的Cookie双方都能读。

    session                                                                                  Session提供了一种把信息保存在服务器内存中的一种方式。它能存储任何数据类型包括自定义对象。

    每个客户端的Session是独立存储。

    Session 对象用于存储有关用户的信息。

    在整个用户会话过程中都会保留此信息。(保存SessionId的cookie丢失之前)

    当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。

    Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了)

    用户不能访问或修改他人的Session

    利用Cookie与Session的一则简单的登陆Demo                                                  

    从一些后台网站上扣了个页面回来,稍加改动:如下图:

    首先搞定一件事,验证码,我从别的地方找到一个写验证码的类,遂直接拿了过来使用,建立一个一般处理程序用来操作验证码,具体代码如下:

    public class CreatValidateCode : IHttpHandler,IRequiresSessionState//一般处理程序需要 session的话,实现此接口
        {
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "image/jpeg";
                Common.ValidateCode validateCode =new Common.ValidateCode();
    
                //创建验证码随机字符串
                string str = validateCode.CreateValidateCode(4);
    
                //将字符串转成 验证码的图片
                validateCode.CreateValidateGraphic(str,context);
    
    
                //验证码交给客户端的时候,将验证码 放到 session
                context.Session["ValidateCode"] = str;
            }
    

    我们把产生的验证码写入带session当中,以防止用户暴力破解,让后再做个小功能,让用户点击验证码能够实现切换验证码的功能,这个我们可以Javascript帮助我们来完成,这里我使用了jquery来做切换图片的功能,后面地址加"1"主要是为了兼容IE

        $(function () {
                $("#Image1").click(function () {
    
                    //先把当前 图片的 url地址取出来。
                    var originUrl = $(this).attr("src");
                    
                    //给当前 图片的src地址设置一新的地址
                    $(this).attr("src", originUrl + 1);
                });
    

    验证码的功能搞定后,下面我们可以登陆逻辑了,这里的文本框都是用普通的html标签,好了开始写登陆逻辑了

    首先了第一次请求过来,先从cookie中获取已经登录过的用户名,放到文本框中,提高用户的体验,后续请求再来的时候,直接从表单里面获取值,在放到文本框里面去

     protected void Page_Load(object sender, EventArgs e)
            {
                if(!IsPostBack)//第一次请求过来,先从cookie中获取已经登录过的用户名,放到文本框中,提高用户的体验
                {
                   PreUserName = Request.Cookies["UserName"] == null
                                            ? string.Empty
                                            : Request.Cookies["UserName"].Value;
                }
                else
                {
                    //后续请求再来的时候,直接从表单里面获取值,在放到文本框里面去
                    PreUserName = Request["txtLoginName"];
                }
            }
    

    首先我们提交的时候首先要对验证码进行校验,具体的做法就是取出session跟用户请求的验证码是否一致,这一步要在其他验证之前

      //取出发送给当前客户端的验证码
                string sendCode = Session["ValidateCode"] == null ? string.Empty : Session["ValidateCode"].ToString();
                string recieveCode = Request["txtCode"];
    
                if (!sendCode.Equals(recieveCode))
                {
                    Js = "<script>alert('验证码不正确')</script>";//推荐大家使用这种方式。来往前台传递js脚本
                    return;
    }

    下面开始校验用户名跟密码,我写的比较简单,用的三层来写的,首先获取用户的请求,然后从数据库中查出是否存在这个用户,存在就写入session当中,并且把用户名写入到cookie中,我剩了这一步,然后跳转到别的页面

     string strUserName = Request["txtLoginName"];
                string strPwd = Request["txtPassword"];
    
                //将用户的信息查询出来,放到 Session里面去
                BLL.HKSJ_USERS userInfoService =new HKSJ_USERS();
    
                Model.HKSJ_USERS user = userInfoService.GetLoginUserModel(strUserName, strPwd);
                if(user ==null)
                {
                    //用户登录失败
                    Js = "<script>alert('用户名密码不正确')</script>";//推荐大家使用这种方式。来往前台传递js脚本
                    return;
                    
                }
    
                //将用户的信息放到Session里面去
                Session["loginUser"] = user;
    this.Response.Redirect("AdminIndex.aspx");

    大致的登陆就算是完成呢,当然还有些细节上的东西需要处理下的.

    思考                                                                                      

    如果我们是做后台管理之类当我们登陆后,后台页面肯定不止一个,那么我们是否要每次都要查询是否有sesiion了?如果每次这么做,那么会是有多么麻烦呢!

    有一种解决的办法,我们可以定义一个basepage类,让它继承page,然后子页面再继承basepage,我们把对session的校验的事大可以放到基类的方法里面来做,具体怎么做了,首先需要一个basepage类

    public class BasePage :System.Web.UI.Page//页面基类
        {
            protected Model.HKSJ_USERS CurrentLoginUser { get; set; }
    
    
            //虚方法,允许子类重写此方法
            protected virtual void Page_PreInit(object sender, EventArgs e)
            {
                CurrentLoginUser = (Model.HKSJ_USERS)Session["loginUser"];
                if (CurrentLoginUser != null)//如果用户已经登录,那么Session里面就存放着用户登录的信息
                {
    
    
                    //this.Response.Write(currentLoginUserInfo.ID + currentLoginUserInfo.LoginName);
                }
                else//
                {
                    this.Response.Redirect("~/公司网站/后台管理/Login.aspx");
                }
            }
        }
    

    然后我们在子类当中就可以重写方法,先调用父类方法,然后再写自己独有的.所谓的don't repeat yourself,不重复自己.

    cookie跟session帮我们保持状态做了不少的贡献,他们各自有各自的特点跟使用场景,我们应该好好利用他们来帮我们解决一些状态保持的问题,当然还有viewstate application类 等也能帮我们保持状态,今天就说这两个了~ 我是个asp.net初学者,有些地方写的不好,望见谅,希望能够共同学习,共同进步~

  • 相关阅读:
    嵌套类型返回错误解决办法(如迭代器的设计)
    UITableView的多选删除模式
    UITableView的编辑模式
    指针和引用初理解
    strstr()函数实现
    一句话的单词倒置
    字符串过滤程
    strcpy函数
    二叉排序树(Binary Sort Tree)
    二叉树插入操作
  • 原文地址:https://www.cnblogs.com/wings/p/2753120.html
Copyright © 2011-2022 走看看