首页
知识
文库
登录
|
注册
首页
最近更新
所有主题
我的主题
我的收藏
首页
·
知识
·
Label
编辑:
图片来源:网络
下面对维持用户状态作简单的描述,如果要深入描述,写一本专业书籍也不过分,其中的使用技巧,需要在实践中获取。
Asp.Net 编程依赖Http协议,而Http协议本身是无状态的,如果要维护用户的状态,那么要采用一些技术方法,根据不同的状况,可以使用不同的方法。
维持用户状态的方法,如下:
查询字符串
:在用户访问Web的地址中加入查询字符,可以标记用户状态,因为查询字符是可见的,所以不要用来存储密码等敏感信息;只要提供正确的查询字符,随时有效。
Cookies
:可以在用户端存储少量的信息,但是浏览器可能不支持,或者关闭了此功能,所以使用前,要检测客户浏览器是否支持,才可以使用;Cookie的有效期可以设置,几分钟、几天、几月不等,可以根据需要,在未过期前,访问Web站点都是可用的。
ViewState
:在Page页面使用ViewState属性存储变量,因为ViewState在Client-Server请求中传输,所以存储的变量不宜过多,否则会影响性能;另外,存储的变量是页面级的,只在本页面有效。
Session
:在Server端存储当前用户定义的变量,要分辨用户,要使用Cookie或者查询字符来标记用户,另外,存储的用户变量要占用系统资源,可以根据配置,选择Session变量存储的位置,如本级,或者其他机器。作用范围是整个会话过程。
Application
:用来存储整个Web站点的全局变量,对所有访问用户有效。作用范围是整个Web。
使用查询字符:
格式如webform1.aspx?name=user,使用方法Response.Redirect来实现:
private
void
Button1_Click(
object
sender, System.EventArgs e)
{
//
Redisplay this page with a QueryString
Response.Redirect(
"
Webform1.aspx?name=user
"
);
}
客户端可以使用QueryString方法来解析查询字符:
private
void
Page_Load(
object
sender, System.EventArgs e)
{
//
Display the query string.
Response.Write(Request.QueryString[
"
name
"
]);
}
使用Cookie:
Cookie适合在客户端存储少量的数据,用来标示用户的特定信息,如姓名,爱好等等;因为浏览器可以不支持Cookie,所以使用时,应该先检测客户是否支持cookie:
private
void
Page_Load(
object
sender, System.EventArgs e)
{
//
Run the first time this page is displayed.
if
(
!
IsPostBack)
//
If the browser supports cookies.
if
(Request.Browser.Cookies)
{
//
Create a cookie.
HttpCookie cookUPrefs
=
new
HttpCookie(
"
UPrefs
"
);
cookUPrefs.Value
=
"
English
"
;
//
Add the cookie.
Response.Cookies.Add(cookUPrefs);
}
}
下面代码可以检查请求是否包含cookie,如果有,那么获取cookie的值:
private
void
Page_Load(
object
sender, System.EventArgs e)
{
//
Run the first time this page is displayed.
if
(
!
IsPostBack)
//
If the browser supports cookies.
if
(Request.Browser.Cookies)
//
Check if the UPrefs cookie exists
if
(Request.Cookies[
"
UPrefs
"
]
!=
null
)
//
Save the value of the cookie.
Session[
"
Lang
"
]
=
Request.Cookies[
"
UPrefs
"
].Value;
}
使用ViewState:
使用ViewState存储变量,是把变量以隐藏字段的形式放在页面中,同时要求变量可以别序列化,如果要存储复杂的变量,那么需要先把变量转换为字符串。
下面的代码是把TextBox中的文本加入到页面的Table中的Cell。
private
void
Button1_Click(
object
sender, System.EventArgs e)
{
//
Add text to the view state.
ViewState.Add(ViewState.Count.ToString(), TextBox1.Text);
}
private
void
Page_Load(
object
sender, System.EventArgs e)
{
if
(IsPostBack)
//
For each item in the ViewState
foreach
(StateItem staItem
in
ViewState.Values)
{
TableRow rowNew
=
new
TableRow();
TableCell celNew
=
new
TableCell();
//
Set cell text.
celNew.Text
=
staItem.Value.ToString();
//
Add cell to row.
rowNew.Cells.Add(celNew);
//
Add row to table
Table1.Rows.Add(rowNew);
}
}
使用Application和Session:
使用Application和Session可以存储任何类型的对象,Scope在整个的WebApplication或者整个Session。
注意以下几点:
Application和Session建立对象时不做名称和类型检查,这部分工作需要开发者来做;
维持Session影响性能,可以在Application或者Page Level来关闭此功能;
Application建立的对象,只在当前进程有效,对于多进程或者多Web Application,每个Application维持自己的对象,不相互影响;
Session对象,依赖前面讲的Cookie或者QueryString来标示用户,需要知道存储的信息是哪个用户的,一般是采用生成SessionID,通过Cookie发给用户,用户访问时,在Cookie中提供这个SessionID,说明身份。
使用简单,但是容易出错,如:
Application[
"
Uname
"
]
=
"
Wombat
"
;
Response.Write(Application[
"
Unamme
"
]);
为了避免这种状况,最简单的办法是建立一个页面的变量,在Page_Load事件中获取Application变量,然后作其他处理,最后在Page_UnLoad中更新Application变量的值。
string
mstrUname
=
""
;
private
void
Page_Load(
object
sender, System.EventArgs e)
{
//
Check if state variable exists.
if
(Application[
"
Uname
"
]
!=
null
)
//
Get state variable.
mstrUname
=
Application[
"
Uname
"
].ToString();
//
Set variable
mstrUname
=
"
Wombat
"
;
//
Use variable.
Response.Write(mstrUname);
}
private
void
Page_UnLoad(
object
sender, System.EventArgs e)
{
//
Save the state variables back.
Application[
"
Uname
"
]
=
mstrUname;
}
不知道除了这些方法外,还有没有其他维持状态的办法。 本文作者:佚名 来源:http://www.cnblogs.com/Pierce/archive/2005/11/05/1
CIO之家 www.ciozj.com 微信公众号:imciow
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的
收藏至微信