一、cookie
1.当在浏览器中的地址栏输入某个网站的地址,并敲回车键,或者点击“前往”箭头,前往访问这个网站时,浏览器就在临时文件夹中找到属于这个网站的cookie,并将这些cookie发送到你所请求的网站的服务器上,对于net来说,发送到服务器之后,就存储在名称为request的对象的cookies集合中。
2.同一个网站可以在客户端写多个cookie,但是数量还是有限制的,这跟浏览器有关系,,一半情况下ie是允许一个网站在用户的客户端存储20个cookie,如果多余20个,则将前面的清除掉
3.每个cookie内容的大小是有限制的,一般是K为单位
4.临时cookie存储在浏览器的内存中(或者是硬盘上的某个位置,这个位置由浏览器维护,浏览器关闭,就会将这个位置的内容全部清除掉),一旦浏览器关闭,就会将内存中的内容清空,所以下次再次打开浏览器访问网站,就没有登录信息了。而永久cookie是将cookie写道客户的硬盘上了。即使浏览器关闭,只要cookie的过期时间每到,再次打开浏览器就能获取cookie内容。
5.以IE浏览器为例,可以查看临时目录的位置,此位置存储的是cookie和网站的访问历史记录:
从这里可以引申出3点:
浏览器中的历史记录从哪里来,为什么点击会跳转到相应网站
在服务器端发送cookie时如果没有设定过去时间,在此目录下是看不到的,所以其是临时cookie
如果设置了过期时间则可以再此目录下看到,也就是说存储到了客户端的硬盘上了,所以这是永久cookie
打开cookie,研究cookie的值是怎么编写的
看看多值cookie,如何存储,如何便利输出
6.cookie的编写以及读取cookie
a)编写: HttpCookie cusername = new HttpCookie("xxx");//创建cookie
cusername.Value = xxxxx;//为cookie赋值
cusername.Expires = DateTime.Now.AddMinutes(5);//设置cookie的过期时间
Response.Cookies.Add(cusername);//真正将cookie写入客户端
b)读取:string username = Request.Cookies["xxx"].Value;
c)删除:将过期时间设置的短一些,即可清除此cookie
HttpCookie cookie = new HttpCookie("xxx");
cookie.Value = xxxxx;
cookie.Expires = DateTime.Now.AddMinutes(-5);
//真正的将cookie写到客户端
Response.Cookies.Add(cookie);
7.典型应用:自动登陆和购物车
a)自动登陆
当用户选择“记住我”时,用户再次登陆时记住用户名;当用户选择“自动登陆”时,记住用户名和密码
//判断是否选中“记住我”,如果选中,则将用户民写入cookie
if (CheckBox1.Checked == true)
{
HttpCookie cusername = new HttpCookie("username");
cusername.Value = TextBox1.Text;
cusername.Expires = DateTime.Now.AddMinutes(5);
Response.Cookies.Add(cusername);
}
//判断是否选中“自动登录”,如果选中,则将用户名和密码全部写入到cookie中
if (CheckBox2.Checked==true)
{
//写用户名
HttpCookie cusername = new HttpCookie("username");
cusername.Value = TextBox1.Text;
//cusername.Expires = DateTime.Now.AddMinutes(5);
//写密码
HttpCookie cpassword = new HttpCookie("password");
cpassword.Value = TextBox2.Text;
//cpassword.Expires = DateTime.Now.AddMinutes(5);
Response.Cookies.Add(cusername);
Response.Cookies.Add(cpassword);
}
在Page_Load中获取:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.Cookies["username"]!=null)//记住用户
{
string username = Request.Cookies["username"].Value;
TextBox1.Text = username;
}
if (Request.Cookies["username"]!=null&&Request.Cookies["password"]!=null)//自动登陆
{
string username = Request.Cookies["username"].Value;
string password = Request.Cookies["password"].Value;
if (username=="admin" && password=="123456")
{
Response.Redirect("WebIndex.aspx");
}
}
}
}
b)购物车
在购物网站上点击加入购物车后,将商品的信息存在cookie中,点击查看购物车后将所有信息显示出来。(未实现的功能是显示出来的信息不能再次进行修改,例如添加购买数量或删除商品等。)
aa)点击加入购物车触发的事件:(将所有信息存在一个cookie中)
protected void Button2_Click(object sender, EventArgs e)
{
if (Request.Cookies["product"] != null)(增加值)
{
HttpCookie cookie = Request.Cookies["product"];
cookie.Value += this.spproductname.InnerText + "," + this.Sppruductprice.InnerText + "," + this.imgproduct.Src + "|";
cookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
}
else(创建)
{
HttpCookie cookie = new HttpCookie("product");
cookie.Value = this.spproductname.InnerText + "," + this.Sppruductprice.InnerText + "," + this.imgproduct.Src + "|";
cookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
}
}
如果没有判断那么每执行一次事件就会增加一个cookie.
bb)查看购物车触发的事件:
private void ShowShopCart()
{
//将购物信息从cookie中取出来
if (Request.Cookies["product"] != null)
{
string content = Request.Cookies["product"].Value.TrimEnd('|');
string[] productinfo = content.Split('|');
StringBuilder sb1 = new StringBuilder();
sb1.Append("<table>");
foreach (string item in productinfo)
{
string[] shop = item.Split(',');
sb1.Append("<tr>");
sb1.Append("<td><img src="+shop[2]+"/></td>");
sb1.Append("<td>"+ shop[0] + "</td>");
sb1.Append("<td>" + shop[1] + "</td>");
sb1.Append("</tr>");
}
sb1.Append("</table>");
this.divShop.InnerHtml = sb1.ToString();//将信息放在div中
}
}
二、application
1.Application 所有的用户都可以访问
对 Application 对象调用 Lock 会导致 ASP.NET 阻止运行在其他辅助线程上的代码试图访问应用程序状态中的任何对象。只有当调用 Lock 的线程对 Application 对象调用相应的 Unlock 方法时才解除对这些线程的阻塞。
Application.Lock();
//Application["count"]=(int)Application["count"]+1;
Application.UnLock();
如果没有显式调用 Unlock,当请求完成、请求超时或请求执行过程中出现未处理的错误并导致请求失败时,.NET 框架将自动移除锁。这种自动取消锁定会防止应用程序出现死锁。
2.典型应用:在线人数的统计
a)添加Global.asax(全局应用程序类)
在Application_Start事件中添加如下代码,初始化计数器
Application["UserCount"] = 0;
在Session_Start事件中添加如下代码,每增加一个访问者计数器加1
Application.Lock();
Application["UserCount"] = Convert.ToInt32(Application["UserCount"]) + 1;
Application.UnLock();
以上即可实现在线人数的增加。
b)如何实现人数的减少呢?
在Session_End事件中添加如下代码:
Application.Lock();
Application["UserCount"] = Convert.ToInt32(Application["UserCount"]) - 1;
Application.UnLock();
但关闭浏览器不会触发Session_End事件的。浏览器是客户端控件,Session_End是在服务器中。所以我们要添加一个控件(例如:按钮)
触发Session_End事件。
在一个按钮事件中添加以下代码:
Session.Abandon();即可触发Session_End事件。实现减少人数的功能。
c)不同的浏览器访问会实现人数加一,同一个浏览器关闭后再次访问会实现。如果一直打开同一个浏览器不会实现。
三、session
1.session
只针对当前登陆用户有效。别的用户不能访问
3.session不要存储大量数据
4.session在一个页面定义,在所有页面都可以访问,但是必须是同一个用户
5.session存储与服务器上iis服务进程所开辟的内存空间中,当停止或者重启iis服务后,iis所占的内存空间会被释放掉,同时,存在其内的session也会被清楚掉,所以虽然我们没有关闭浏览器,但是仍让需要重新登录。
应用实例:控制用户在没有登录的状态下,猜到页面地址后访问。如果访问提示错误页面使其进行登陆。
在登录页面用Session["XXXX"]="用户名";记住用户名。
其它页面在Page_Load事件中判断
if (Session["name"]==null)
{
Response.Redirect("WebError.aspx");//调到错误提示页面
}
错误页面布局:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script>
function LodeLogin() {
document.location = "frist.aspx";
}
setTimeout(LodeLogin, 5000);//实现5秒后自动调到登录页面
var count = 5;
function DownTime() {
count--;
document.getElementById('sptime').innerHTML = count;
}
setInterval(DownTime,1000);//实现数字变换
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="position:relative;padding:200px;left:210px">
<tr>
<td>请先登录,页面将在<span id="sptime">5</span>秒之后跳转登陆页面,或点击<a href="frist.aspx">登录</a></td>
</tr>
</table>
</div>
</form>
</body>
</html>
用户访问服务器后,在客户端和服务器都存储一份相同的sessionid,客户端通过cookie存储,存储在浏览器内存中,浏览器关闭,则cookie失效,所以当我们关闭浏览器,再次访问相同网站时,会认为你是一个新的用户。服务器端则可以存储在多个位置,如数据库中、Vs服务器中、IIs服务器中等。
[session的保存是以临时cookie保存在浏览器的内存中,(客户端)如果关闭浏览器将释放,所以再次访问需要重新登录。
session的保存在服务器的内存中,如果未发布将保存在VS临时的服务器内存中,如果关闭服务器再次访问也需要重新登录;
如果发布后,保存在IIS的服务器内存中。]
我们可以将服务器端的sessionid的存储位置改变即:
Session状态模式
ASP.NET 会话状态支持若干用于会话数据的存储选项。每个选项都由 SessionStateMode 枚举中的一个值标识。
下面的列表描述了可用的会话状态模式:
1.InProc 模式,此模式将会话状态存储在 Web 服务器上的进程内(就是存储在iis进程中)。这是默认设置,性能最高。未发布时存在vs服务器中。
2.设置为StateServer时,执行Session.Abandon();方式时不会触发Session_End事件
iis进程停止,或者iis服务关闭,服务器端保存的session也不会丢失,这时候只要客户端的浏览器不关闭,等iis服务器启动后,仍然可以继续访问(客户端浏览器不能关闭,因为客户端session以cookie形式存储在浏览器内存中)
需要启动asp.net state serveice服务,此服务默认为停止(控制面板->>管理工具->>服务中的->>asp.net state serveice[win7中的是asp.net状态服务])或在运行栏[windows+R]中输入serveices.msc
如果想将session存储到其他计算的aspnet state service服务中,需要开启远程服务器的允许远程存储功能,开发方法为:修改注册表编辑器(打开注册表编辑器(打开运行栏windows+R)输入regedit即可,或C:\windows\regedit.exe即可): [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters] 设置 AllowRemoteConnection = 1
默认端口42424
使用state server方式存储session,web.config中的配置如下<sessionState cookieless="false" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" ></sessionState>(本机时tcpip为本机的id,或localhost)
3.会话状态存储到一个 SQL Server 数据库中,性能损失10%-20%
此时哪怕重新启动了服务器,只要用户不关闭浏览器session都不会丢失
用处在哪里?比如购物网站,用户正在购物,但服务器需要重启,只要用户保证浏览器不关闭,等服务器重启完成之后,其session信息都不会丢失,当然还有其他替代方法
在数据中服务器中安装asp.net会话数据库的方法:打卡C:\Windows\Microsoft.NET\Framework\v4.0.30319,在cmd中输入以上目录在加入aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p即可
在数据中服务器中移除asp.net会话数据库的方法
aspnet_regsql.exe -S . -U sa -P 123456 -ssremoce
注意大小写
在web.config中的配置:<sessionState cookieless="false" mode="SQLServer" sqlConnectionString="server=“服务器名称”;uid=用户名;pwd=密码"></sessionState>
4. Custom 模式,此模式允许您指定自定义存储提供程序。
5. Off 模式,此模式禁用会话状态。
发布网站:
在Vs中右击点击发布,经行一系列设置后点击确定,在IIs中添加网站,物理路径选择自己发布的路径,Ip为自己的地址。点击确定即可。
如果在别人上无法访问到,即可关闭自己的防火墙试一试。