Request对象、Cookie对象、Session对象

目录

一、Request对象

二、Cookie对象

1、会话Cookie(Session Cookie)

2、持久性Cookie

问题一:为什么Microsoft Edge修改不了到期时间且不能自动删除呢?

三、Session对象


暂且看一下吧,对于这几个内容我理解的不够透彻。。。

一、Request对象

        前面一篇中,提到了Request,但是说的是将客户机浏览器上的数据传输到服务器的两种方法(Get方法和Post方法),而这里要说的是获取客户端浏览器信息的Browser。

        在使用的时候,往往是Response.Write()方法和Request.Browser对象配合使用,然后得到所需要的结果:

下面就直接使用代码以及其输出的结果来说明它的一般使用方法吧。

启动运行,查看结果:

 全部出错,天哪,回去找错误原因。

  1. Request.Browser后面必须要加个属性,即默认情况下会输出:System.Web.Mobile.MobileCapabilities(输出的结果是移动设备的能力信息,而不是浏览器的信息。);
  2. <br>不以换行输出,而是直接输出字符串,是因为它们之间的空格有点大,要以换行输出,<和br之间就不应该有空格;
  3. 最下面的两个是由于我的粗心,忘记修改了,所以不会输出想要的结果。

要实现上面的输出,应该使用的代码:

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("若无属性" + Request.Browser +"<br>" );
            Response.Write("浏览器类型" + Request.Browser.Browser + "<br>");
            Response.Write("浏览器版本" + Request.Browser.Version + "<br>");
            Response.Write("浏览器主版本" + Request.Browser.MajorVersion + "<br>");
            Response.Write("浏览器次版本" + Request.Browser.MinorVersion + "<br>");
            Response.Write("支持JavaScript" + Request.Browser.JavaScript + "<br>");
            //下面这两个就属于Request.Browser对象了。
            Response.Write("客户端访问网址" + Request.Url + "<br>");
            Response.Write("客户端访问主机" + Request.UserHostAddress + "<br>");
        }

结果:

 Request.Browser的属性还是挺多的,不需要全部记下来,使用的时候直接查就好了。

二、Cookie对象

Cookies是一些存储在用户电脑上的小文件。它是被设计用来保存一些站点的用户数据。

有两种类型的Cookie:会话Cookie(Session Cookie)和持久性Cookie。前者是临时性的,一旦会话状态结束它将不复存在;后者则具有确定的过期日期,在过期之前Cookie在用户的计算机上以文本文件的形式存储。

首先,学习cookie这个对象,就需要找到cookie所在的位置,这里我用Microsoft Edge浏览器,没找到,所以就跑去谷歌,也没找到,所以最后,我就去搜索了一下,直接在Microsoft Edge浏览器中演示吧。

点开这个锁,就可以看到里面正在使用的cookie个数了:

查看一下当前的cookie,然后在演示的时候就可以清楚的看到添加的cookie了:

1、会话Cookie(Session Cookie)

        这种Cookie的特点就是加入网页之后,在网页中查看,它是存在的,但是一旦关闭这个网页,那么就意味着这个会话结束,这个cookie就自动删除了。

        首先,使用一个小例子来演示这种cookie:尝试加入一个用户名、账号的cookie,用户名为wangwu,密码为123:

添加Cookie信息:Response对象支持一个名为Cookies的集合,可以将Cookie对象添加到该集合中,从而向客户端输出Cookie    Response.Cookies[“UserName”].Value=“tom”

        protected void Button1_Click(object sender, EventArgs e)
        {
            HttpCookie n = new HttpCookie("new");//n 是一个变量名,用来引用一个 HttpCookie 对象。而 "new" 是一个字符串,用作新创建的 HttpCookie 对象的名称。
            n.Values["username"]= "wangwu";
            n.Values["pwd"] = "123";
            Response.Cookies.Add(n);
            Response.Write("成功写入!");
        }

 启动运行,看看:

点击一下button:

然后在cookie中查看是否有新添加的:

这里显示的new即为刚才所新添加的,当然,也可以点进去看看:

可以看到新添加进去的内容。

然后叉掉这个网页,重新打开cookie,发现并没有删除,这可能是因为我当前在使用Microsoft Edge浏览器,所以系统默认会话没有结束,那么下面换一个浏览器试试:

 然后重新打开,就可以看到,前面添加的cookie记录已经被删除了:

那么,如果我们想让他长久的保存,而不是用一次就删除,那要怎么操作呢?下面,就开始说明。

2、持久性Cookie

指定Cookie过期日期:Response.Cookies[“UserName”].Expires=new DateTime(2022,11,30);

 所以,就在原先添加的cookie的基础上添加一个过期时间就好了。

但是如果直接按照前面的方法进行添加的话,并不能修改到期时间:

所以,必须要注意这个情况。下面就按照块引用中的方法修改到期时间。

问题一:为什么Microsoft Edge修改不了到期时间且不能自动删除呢?

尝试使用Google:
 我的Google看不到里面的内容,不知道为什么,呜呜呜呜,就先这样记住吧。如果后面发现错误了再进行修改吧。

说发现错误了就修改,果然发现错误了,要修改到期时间,应该在添加了新cookie之后再修改,而我前面是将到期时间和新增的内容一起加上去,最后才保存的:

这样是不能实现它的修改的(因为是添加了这个cookie之后(即Response.Cookies.Add(n);),才能去修改它的到期时间,而没添加之前,当然无法找到这个cookie,也就无法改变它的到期时间了)。

所以正确的代码是这样的:

        protected void Button1_Click(object sender, EventArgs e)
        {
            HttpCookie n = new HttpCookie("New");//n 是一个变量名,用来引用一个 HttpCookie 对象。而 "New" 是一个字符串,用作新创建的 HttpCookie 对象的名称。
            n.Values["username"]= "wangwu";
            n.Values["pwd"] = "123";
            n.Values["datetime"] = DateTime.Now.ToString();
            
            Response.Cookies.Add(n);
            Response.Cookies["New"].Expires = new DateTime(2025, 2, 4);//这里注意是该对象的名称new,而不是变量名,且对象名要用双引号引起来。
            Response.Write("成功写入!");
        }

运行一下:

成功修改!

那么保存cookie有什么用呢?

        这个作用就可以拿我们登录页面中的自动登录,或者记住密码来说明了。

我们在网页登录某个东西,如果不想每次都输入账号,密码,我们就一般会点一下下次自动登录这个选项,所以,我们这里就尝试设置一下登录一次后下次自动登录的功能吧。

依旧以前面的两个控件,外加一个 checkbox(免登录):

下面就使用代码实现这个功能了。

首先,写入的时候,存入的肯定是两个文本框的值,所以如果点击checkbox,就把两个文本框的值存到cookie里面,且不能忘记设置到期时间,然后再登录这个界面的时候,判断一下,cookie里有没有存着前面的值,如果cookie中的账号,密码不为空,则直接跳转。

新建一个web窗体:

按照自己的想法,写出的代码如下:
 

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Cookies["ID"] != null && Request.Cookies["pwd"] != null){
                Response.Redirect("webform2.aspx");
            }

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (CheckBox1.Checked)
            {
                HttpCookie nc = new HttpCookie("login");
                nc.Values["ID"] = TextBox1.Text;
                nc.Values["pwd"] = TextBox2.Text;
                nc.Values["dt"] = DateTime.Now.ToString();
                Response.Cookies.Add(nc);
                Response.Cookies["login"].Expires = new DateTime(2025, 2, 4);
            }
            Response.Redirect("webform2.aspx");
        }

运行试一下,可以不:

初始界面:
 然后添加内容,点击button:

进入的界面:
 

关闭之后,重新运行:

为什么点击button之后才能进去,而不是直接进去呢?

 

 看了一下,老师的做法:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Cookies["ID"] != null && Request.Cookies["pwd"] != null){
                Response.Redirect("webform2.aspx");
            }

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (CheckBox1.Checked)
            {
                Response.Cookies["ID"].Value = TextBox1.Text;
                Response.Cookies["ID"].Expires = new DateTime(2025, 2, 4);
                Response.Cookies["pwd"].Value = TextBox2.Text;
                Response.Cookies["pwd"].Expires = new DateTime(2025, 2, 4);

            }
            Response.Redirect("webform2.aspx");

没有新建对象,而是直接写的value和expires值。运行试试:

 

第二次进入之后,就直接进去了:
 

为什么使用老师的方法就可以实现免登录,而使用我写的这种,就不会自动登陆呢。

首先,是在新建对象的区别,我新建了一个对象,然后再添加的属性,那么就只有login这一个对象;而老师的没有新建对象,且直接使用ID和pwd两个,为他们赋值,所以系统默认新建了两个对象:ID和pwd。

所以,在初始化判断的时候,老师的这种方法,可以找到ID和pwd两个对象,而我的找不到这两个对象,所以系统会认为ID和pwd两个对象为null,所以进不去。如果想使用我的这种方法,那么在判断语句中就不应该是判断ID和pwd是否为null,而是判断login中的两个属性是否为null,那么该怎么实现呢?

将初始化语句换成这个就可以了,但是,这种并没有什么意义,因为如果我随便输入内容,这个cookie也不是null,也可以直接跳进登录的界面。而且,如果一旦进入,不到到期时间,我们是不可以退出到登陆界面换账号的,这个又是一个问题。

解决办法:设置某些特定账号和密码的登录权限(至于怎么完成,后面慢慢研究吧,这只是一个我的想法);针对于换账号的这个问题,我们就可以想想怎么实现延长到期时间的,把它缩回去不就好了吗?即在跳转进去的界面,设置一个linkbutton,然后设置它的功能为将到期时间换成过去的时间,那么一下子就可以回去了。比如:

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Response.Cookies["login"].Expires = new DateTime(2024, 2, 4);
            Response.Redirect("webform1.aspx");
        }

 

 

成功跳转。

 

三、Session对象

每个ASP.NET应用程序的运行实例都可以由一个Application对象来表达。

Session 可以保存变量,该变量只能供一个用户使用,也就是说,每一个网页浏览者都有自己的Session对象变量,即Session对象具有唯一性。

Session对象有生命周期,默认值为20分钟,可以通过TimeOut属性设置会话状态的过期时间。

如果用户在该时间内不刷新页面或请求站点内的其他文件,则该Session 就会自动过期,而Session对象存储的数据信息也将永远丢失

将新的项添加到会话状态中的语法格式为:Session ["键名“] = 值; 或  Session.Add( "键名" , 值);

按名称获取会话状态中的值的语法格式为:变量 = Session ["键名"];     

删除会话状态集合中的项的语法格式为:Session.Remove("键名");

清除会话状态中的所有值的语法格式为:Session.RemoveAll()   或者  Session.Clear()

取消当前会话的语法格式为:    Session.Abandon()

设置会话状态的超时期限,以分钟为单位。语法格式为: Session.TimeOut = 数值

下面,举例来学习它的用法吧。

依旧使用前面的控件,但是现在不添加cookie:

 

运行一下:
 

登陆一次之后,我们退到第一个登陆界面中,然后在上方修改地址栏为2,可以发现,就算不点button,就算没有输入正确的账号和密码,它依旧会跳到admin界面:
那么怎样解决这么个问题呢?

就要用到session对象了,下面我们给他添加一个session对象,再试试:
webform1.aspx:

        protected void Button1_Click(object sender, EventArgs e)
        {
            if(TextBox1.Text == "admin" && TextBox2.Text == "123")
            {
                Session["user"] = "admin";
                Response.Redirect("webform2.aspx");
            }
            else
            {
                Response.Write("账号或密码错误");
            }
        }

webform2.aspx:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["user"] == "admin")
            {
                Response.Write("欢迎访问" + Session["user"]);
                // Response.Redirect("webform2.aspx");
            }
            else
            {
                Response.Write("<script>alert('请登陆后再操作');window.location.href='webform1.aspx'</script>");
            }

        }

 最终结果:

但是我觉得我还是不太能理解,害,慢慢来吧。

如果想根据不同的账号转到不同的网页,那么看看这个截图吧,我不太理解这个,所以就先不往下继续写了,后面理解了慢慢补充:
 

那就先这样吧。 

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Session 是 Web 应用程序中常用的一种机制,它用于存储用户的数据,以便在应用程序的不同页面中进行共享。Session 可以通过 cookie 或 URL 参数来实现,但是最常见的方式是使用 cookie。 在使用 session 时,服务器会为每个用户分配一个唯一的会话 ID,并将该 ID 存储在 cookie 中。每次用户访问网站时,服务器都会从 cookie 中获取会话 ID,然后将与该 ID 相关联的数据加载到 session 对象中。 下面是一个使用 session 的示例: ```python from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) app.secret_key = 'mysecretkey' @app.route('/') def index(): if 'username' in session: username = session['username'] return 'Logged in as ' + username + '<br>' + \ "<b><a href = '/logout'>click here to log out</a></b>" return "You are not logged in <br><a href = '/login'></b>" + \ "click here to log in</b></a>" @app.route('/login', methods = ['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action = "" method = "post"> <p><input type = "text" name = "username"/></p> <p><input type = "submit" value = "Login"/></p> </form> ''' @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('index')) ``` 在上面的示例中,我们首先需要导入 Flask 和 session。然后,我们创建一个名为 app 的 Flask 实例,并将其密钥设置为 "mysecretkey"。这个密钥用于保护 session 数据,因此应该保持机密。 接下来,我们定义了三个路由函数: - index():该函数检查 session 是否包含一个名为 "username" 的键,如果是,则返回用户已登录的消息;否则,返回用户未登录的消息。 - login():该函数使用 POST 方法处理表单提交,并将输入的用户名存储在 session 中。然后,该函数将用户重定向到 index() 函数。 - logout():该函数从 session 中删除 "username" 键,并将用户重定向到 index() 函数。 在上面的示例中,我们使用了 Flask 的内置 session 对象来存储用户的数据。session 对象是一个类字典的对象,可以使用与字典相同的方式存储和访问数据。可以使用 session['key'] = value 来存储数据,使用 session.get('key') 来获取数据。 总之,使用 session 可以方便地在不同页面之间共享用户数据,并且可以通过设置密钥来保护敏感数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值