目录
问题一:为什么Microsoft Edge修改不了到期时间且不能自动删除呢?
暂且看一下吧,对于这几个内容我理解的不够透彻。。。
一、Request对象
前面一篇中,提到了Request,但是说的是将客户机浏览器上的数据传输到服务器的两种方法(Get方法和Post方法),而这里要说的是获取客户端浏览器信息的Browser。
在使用的时候,往往是Response.Write()方法和Request.Browser对象配合使用,然后得到所需要的结果:
下面就直接使用代码以及其输出的结果来说明它的一般使用方法吧。
启动运行,查看结果:
全部出错,天哪,回去找错误原因。
- Request.Browser后面必须要加个属性,即默认情况下会输出:System.Web.Mobile.MobileCapabilities(输出的结果是移动设备的能力信息,而不是浏览器的信息。);
- <br>不以换行输出,而是直接输出字符串,是因为它们之间的空格有点大,要以换行输出,<和br之间就不应该有空格;
- 最下面的两个是由于我的粗心,忘记修改了,所以不会输出想要的结果。
要实现上面的输出,应该使用的代码:
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>");
}
}
最终结果:
但是我觉得我还是不太能理解,害,慢慢来吧。
如果想根据不同的账号转到不同的网页,那么看看这个截图吧,我不太理解这个,所以就先不往下继续写了,后面理解了慢慢补充:
那就先这样吧。