Cookie
学习于 http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html
1.cookie不仅可以存储字符串,还可以存储较复杂的对象:
private void WriteCookie()
{
Person p = new Person { Name = "hp", Age = 30 };
HttpCookie cookie = new HttpCookie("Mycooike", ToJson(p));
Response.Cookies.Add(cookie);
}
//将对象JSON序列化为字符串
private String ToJson(Object obj)
{
if (obj == null)
{
return String.Empty;
}
else
{
JavaScriptSerializer js = new JavaScriptSerializer();
return js.Serialize(obj);
}
}
private void ReadCookie()
{
HttpCookie cookie = Request.Cookies["Mycooike"];
if (cookie == null)
{
Label1.Text = "null";
}
else
{
Person p = FromJson(cookie.Value);
Label1.Text = p.Name;
Label2.Text = p.Age.ToString();
}
}
//把JSON字符串反序列化对象
private Person FromJson(String cookieValue)
{
if (String.IsNullOrEmpty(cookieValue))
{
return null;
}
else
{
JavaScriptSerializer js = new JavaScriptSerializer();
return (Person)js.Deserialize(cookieValue, typeof(Person));
}
}
//这种方式产生的有些字符,比如【双引号】,极少数浏览器(Opera)不支持,所以需要做UrlEncode或者Base64编码处理。
2.cookie 与 session的关系
HttpContext类,Page类中都有一个HttpSessionState类的对象叫Session的成员,可以使用它来方便地在服务端保存一些与会话相关的信息。
摘录:HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器端无法区分是不是来源于同一个浏览器。所以,为了实现会话,服务端需要一个会话标识ID能保存到浏览器,让它在后续的请求时都带上这个会话标识ID,以便让服务端知道某个请求属于哪个会话,这样便可以维护与会话相关的状态数据。由于Cookie对于用户来说,是个不可见的东西,而且每次请求都会传递到服务端,所以它就是很理想的会话标识ID的保存容器。在Asp.net中,默认也就是使用Cookie来保存这个ID的。注意:虽然Asp.net 2.0也支持无Cookie的会话,但那种方式要修改URL,也有它的缺点,因此这种方法并没有广泛的使用。
每次浏览器对同一站点访问,只要在后台代码中用到了session对象,则服务端就会为这次访问【会话】(不是为每一个session对象,即使用了多个sessoin对象,它们都属于同一次会话,只有一个session_id)成一个session_id, 且这个session_id保存在cookie中,保存这个session_id的cookie的名字默认是ASP.NET_SessionId【只保存session_id以标识属于哪个会话,并没有保存session中的值,session中的值保存在服务器端】,通过Fiddler工具可以看的到,如果想自定义这个cookie名字,可以在web.config文件里进行设置,如
<system.web>
<sessionState mode="InProc" cookieName="tty"></sessionState>
</system.web>
设置后这个cookie的名字就是tty了,
当第一次进入(访问)站点时,由于cookie的赋值(写入)是在服务端进行的,所以第一次看到这个cookie是在http response-header中看到的,如果在没有退出(离开)该站点的情况下对站点的其他网页进行访问,此时,这个cookie就会在每次的request-header中出现,并随请求一起发送到服务端,且该cookie中的值(即session_id)不变。
3.JS中读写cookie
Cookie并非只能在服务端读写,在客户端的浏览器中也可以实现对它的读写访问, 是通过JS来实现的,且在JS中创建的Cookie对于服务端仍然有效(可见)
function write1() {
var cookie1 = "Mycookie=66666666; path=/";
var cookie2 = "Testcookie=123456789; path=/";
document.cookie = cookie1;
document.cookie = cookie2;
}
//创建了两个cookie
//读取cookie
function read2() {
alert(document.cookie);
}
//HttpCookie有个HttpOnly属性,如果它为true,那么JS是读不到那个Cookie的,也就是说: 我们如果在服务端生成的Cookie不希望在JS中能被访问,可以在写Cookie时,设置这个属性。不过,通过一些工具,还是可以看到它们。
//ASP.NET中记录session id 的那个cookie的HttpOnly属性默认设置是true
//ASP.NET的Forms认证也是依赖cookie来实现的,Asp.net就是每次检查我们在配置文件中指定的Cookie名称,并解密这个Cookie来判断当前请求用户的登录状态。
4.Cookie安全
Cookie中的值都是“一目了然”的,任何人都能看到它们。所以,我们尽量不要直接在Cookie中 保存一些重要的或者敏感的内容。如果我们确实需要使用Cookie保存一些重要的内容,但又不希望被他人看懂, 我们可以使用一些加密的方法来保护这些内容。