[转]ASP.Net篇之Session与Cookie

本文转自:http://www.cnblogs.com/japanbbq/archive/2011/08/31/2160494.html

Session:

Session是“会话”的意思,然而,因为http协议是无状态的,那么每次客户端请求服务器端,服务器端都会以“崭新”的页面展示给客户端,这在静态的html页面中是不会存在任何影响,但是在动态页面中,需要与用户交互,要保持与客户端用户的联系,则需要一些东西来保持,而Session的话,则是具有“保持状态,保持会话”的能力。

注意的是,Session是保存在服务器端的。(Cookie是保存在客户端的)需要注意的是,如果用户突然关闭了客户端页面,那么Session就会丢失,即“会话丢失”。

 

服务器端创建session的三个步骤(网上参考):

1. 生成全局唯一标识符(sessionid);

2. 开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享;

3. 将session的全局唯一标示符发送给客户端。

     问题的关键就在服务端如何发送这个session的唯一标识上。联系到HTTP协议,数据无非可以放到请求行、头域或Body里,基于此,一般来说会有两种常用的方式:cookie和URL重写。

1. Cookie(sessionid会保存在Cookie里,并且失效时间为0,就是浏览器进程的有效时间,如果关闭了浏览器,那么session就会失效,原理就是如此)

读者应该想到了,对,服务端只要设置Set-cookie头就可以将session的标识符传送到客户端,而客户端此后的每一次请求都会带上这个标识符,由于cookie可以设置失效时间,所以一般包含session信息的cookie会设置失效时间为0,即浏览器进程有效时间。至于浏览器怎么处理这个0,每个浏览器都有自己的方案,但差别都不会太大(一般体现在新建浏览器窗口的时候);

2. URL重写(平时网上url地址上有 ?sessionID=xxxx 字样)

所谓URL重写,顾名思义就是重写URL。试想,在返回用户请求的页面之前,将页面内所有的URL后面全部以get参数的方式加上session标识符(或者加在path info部分等等),这样用户在收到响应之后,无论点击哪个链接或提交表单,都会在再带上session的标识符,从而就实现了会话的保持。读者可能会觉得这种做法比较麻烦,确实是这样,但是,如果客户端禁用了cookie的话,URL重写将会是首选。

 

 

Session在ASP.Net的基本用法

定义的时候: Session["ddd"]=xxxx;

使用的时候:Session["ddd"]即可

如果需要保存类的对象的话,用法跟ViewState是一样的:

发送端:

UserInfo ui = new UserInfo(); 
Session["ui"] = ui; 
ui.name = name.Text; 
ui.age = age.Text; 
ui.sex = sex.Text; 
ui.password = password.Text; 
Response.Redirect("a.aspx"); 

接收端:

UserInfo ui = Session["ui"] as UserInfo; 
name.Text = ui.name; 
age.Text = ui.age; 
password.Text = ui.password; 
sex.Text = ui.sex;

 

Session时间(销毁方式:超时和手动销毁):

asp.net Session的默认时间设置是20分钟,即超过20分钟后,服务器会自动放弃Session信息.

 

Session Hijack (网上参考):

Session hijack即会话劫持是一种比较严重的安全威胁,也是一种广泛存在的威胁,在session技术中,客户端和服务端通过传送session的标识符来维护会话,但这个标识符很容易就能被嗅探到,从而被其他人利用,这属于一种中间人攻击。

 

Cookie

cookie的最大好处使用的就是"Remember Me"的服务。

cookie保存在客户端,如果用户禁用了cookie的话,可能会存在一些问题,所以在设计的时候要注意(判断cookie是否为null)

需要cookie的原因跟需要session一样,因为http协议是无状态的,每次都是新的页面,不会保存任何信息,而cookie的话,会保存在客户端的电脑上,那么到时需要用的时候,可以利用后台的服务器端调用,也可以就用客户端来进行调用。

Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。(网上参考)

 

 

Cookie的限制:

大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

 

Cookie中的属性:(网上参考)

name: 每个cookie由一个唯一的名称代表,这个名称可以包含字母、数字、下划线。cookie的名称是不分大小写,所以mycookie和MyCookie是一样。但考虑到服务器端语言可能区分大小写,建议定义和使用时还是区分大小写。

value: 保存在cookie中的字符串值。这个值在存储之前必须使用encodeURIComponent()对其进行编码,以免丢失数据或占用了cookie。注意:cookie名字和值加起来的字节数不能超过4095字节,也即4KB。

domain: 出于安全考虑,网站不能访问由其他域所创建的cookie。创建cookie以后,域的信息会作为cookie的一部分存储下来。关于域,这里给一个例子,如http://ibm.com/foo/index.aspx, 它的域为:ibm.com。

path: cookie的另一个安全特征,限制对web服务器上特定目录的访问。即控制哪些访问能触发发送.例如请求的地址是上面的url,如果path=/foo,这个cookie就会被发送,但是path为其他的话,该cookie会被忽略。

expires: cookie的过期时间。

secure: 一个true/false值,用于表示cookie是否只能从安全网站(使用SSL和https协议的网站)中访问。如果这个值被设置为true

 

 

Cookie的基本步骤:(网上参考)

浏览器对于Web服务器应答包头中Cookie的操作步骤:

a. 从Web服务器的应答包头中提取所有的cookie。

b. 解析这些cookie的组成部分(名称,值,路径等等)。

c. 判定主机是否允许设置这些cookie。允许的话,则把这些cookie存储在本地。

浏览器对Web服务器请求包头中所有的cookie进行筛选的步骤:

a. 根据请求的url和本地存储cookie的属性,判断那些cookie能被发送给Web服务器。

b. 对于多个cookie,判定发送的顺序。 
c. 把需要发送的cookie加入到请求http包头中一起发送。

 

Cookie在ASP.Net中的基本用法:

发送端:

HttpCookie cookie = new HttpCookie("UserInfo");

cookie["name"] = name.Text;

cookie["age"] = age.Text;

cookie["sex"] = sex.Text;

cookie["language"] = language.Text;

cookie.Expires = DateTime.MaxValue;

Response.Cookies.Add(cookie);

Response.Redirect("cookie2.aspx"); 

接收端:

HttpCookie cookie = Request.Cookies["UserInfo"];

if(cookie!=null)

{

name.Text = cookie["name"]; 
age.Text = cookie["age"]; 
language.Text = cookie["language"]; 
sex.Text = cookie["sex"];

}

else

{   }

最好在接收端上加上一个条件判断,这样则避免如果禁用了cookie,就不会导致出错,也可以确定cookie是否存在。

 

Cookie的用途:

防止网上重复投票; 
通过cookie实现自动登陆 
单点登陆 ( Single Sign On, SSO),是目前比较流行的企业业务整合的解决方案之一. 简单的说, 就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。

 

 

Session和Cookie比较:(网上参考)

1. 应用场景

Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,比如页面布局以及搜索历史等等。

Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;

2. 安全性

cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。

Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie;

3. 性能

Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;

4. 时效性

Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时);

5. 其他

Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。

 

 

关于Session和Cookie两方面的知识还有太多太多要学,现在理解只是皮毛。

 

网上资源来自:

http://www.cnblogs.com/shoru/archive/2010/02/19/1669395.html  大话session

http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html 细说cookie

http://www.cnblogs.com/langzi127/archive/2009/04/08/1431730.html cookie的应用

 

转载于:https://www.cnblogs.com/freeliver54/p/5909611.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 接口详解

概念 接口描述的是可属于任何类或结构的一组相关行为,所以实现接口的类或结构必须实现接口定义中指定的接口成员。 定义:使用interface 关键字,由方法、属性、事件、索引器或这四种成员类型的任意组合构成。另可使用new、public、protected、…

js学习之地图生成

首先,上地图图片 接着,js,我们可以把图片看成一块块32*32像素的 var i; var j;window.onload function () {gamemap(15, 10, 10, "map.jpg"); }var mapimg new Image(); var map [[18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,…

linux性能分析常用的命令

1,uptime 查看系统负责2,more 分页查看文件,enter显示下一行,空格显示下一页,F显示下一屏,B显示上一屏内容。3,top命令查看系统情况,按shif H可以查看当前线程的负载。4&#xff0…

C#中Console.ReadKey()与ConsoleKey的一些用法

1.控制台程序不让窗口闪过 对于控制台程序,Console.ReadKey()可以使窗口停留一下,直到点击键盘任一键为止。 2.通过按键进行选择 key Console.ReadKey(true).Key;if (key ConsoleKey.S){ Console.Write("Input the message:…

【TensorFlow】——Windows10、pycharm、Python3.6.4中安装CPU和GPU两种版本的TensorFlow

tensorflow分为两种,一种是cpu版本,一种是gpu版本 CPU版本可以直接通过pip进行安装: 这里是在国内镜像源中进行的下载,下载的版本是2.2.0版本 pip --default-timeout1000 install tensorflow-cpu2.2.0 -i http://pypi.douban.c…

vsftpd.conf 详解与实例配置

#################匿名权限控制############### anonymous_enableYES   #是否启用匿名用户 no_anon_passwordYES   #匿名用户login时不询问口令 下面这四个主要语句控制这文件和文件夹的上传、下载、创建、删除和重命名。 anon_upload_enable(yes/no)…

下拉框选择

1&#xff0c;简单下拉框 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8" ><meta name"viewport" content"widthdevice-width, initial-scale1, user-scalableno, minimal-ui, maximum-scale1&qu…

基于C#的TCP/IP协议应用(一)

一、背景与概念 1.标准以太网 以太网是美国Xerox&#xff08;施乐&#xff09;公司的Palo Alto研究中心于1975年研制成功的&#xff0c;其核心技术起源于ALOHA网。目前以太网是指符合IEEE 802.3标准的局域网(LAN)产品组&#xff0c;其中IEEE 802.3是一组电气与电子工程师协会…

WORD文档的超链接无法打开——“由于本机的限制该操作已被取消”的解决方法

之前我电脑还很正常&#xff0c;最近装了一个打印机后&#xff0c;放在word文档的文字超链接就打不开了&#xff0c;提示说“由于本机的限制该操作已被取消”&#xff0c;请各位高手指导下该怎样解决这个问题&#xff1f; WORD文档的超链接无法打开的原因是文件在插入超链接之…

广义表的实现

广义表是一种非线性表的数据结构&#xff0c;是线性表的一种推广。他放松了对原子的控制&#xff0c;容许原子有自身的结构。其实现如下&#xff1a; #include<iostream>using namespace std;#include<assert.h>enum Type //原子类型有三种:头结点&#xff0c…

C#中List列表与Datagridview的用法

初始化 创建空列表 List<int> List new List<int>();2.使用var类型的前提是预先知道变量的类型&#xff0c;会根据变量赋值来判定属于什么类型&#xff0c;但此种赋值方法只能给局部变量赋值。 var list1 new List<string>();具体见&#xff1a; C#列表L…

Byte和byte[]数组

Byte和byte[]数组&#xff0c;“表示一个 8 位无符号整数, 一般为8位二进制数”。 Byte是计算机最基础的存储单位和最基础的通讯单位。 而所有的类型都是支持由byte[]类型转换而来。 为什么说Byte是最基础类型那&#xff0c; 其实这里的关键所在是&#xff0c;计算机最基础的算…

【图像处理】——opencv常用函数

目录 读取图像 注意: 1、imread和plt.show以及pil.image,show的区别: 2、imread中的rgb的顺序 显示图像

网络协议:TCP/IP、SOCKET、HTTP

网络七层 由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层&#xff0c;是网络工程师所研究的对象&#xff1b;传输层、会话层、表示层和应用层则被称作主机层&#xff0c;是用户所面向和关心的内…

halcon自标定

概念 该算法可以在不使用标定板的情况下计算相机内参&#xff0c;从而进行畸变校正&#xff0c;适用于畸变较大的情况。算法很简单&#xff1a; 1.求出图像边缘应进行分割。 2.基于筛选线段的自标定radial_distortion_self_calibration。 3.得到标定区域。 4.根据指定的径向畸…

jdk动态代理

简单的说&#xff0c;代理模式是在目标对象和访问对象之间增加了一层代理对象&#xff0c;所有的访问对象通过代理对象来实现对目标对象的调用。 代理对象和目标对象实现同一个接口&#xff0c;由代理对象来调用目标对象&#xff0c;对于外部来说&#xff0c;代理对象就可以替代…

【图像处理】——图像的灰度化处理(Python实现三种方法——最大值法、平均值法、加权均值法、gamma校正)

目录 一、什么是图像的灰度化? 二、灰度化的几种方法(最大值法、平均值法、加权均值法、gamma校正)

配置https

引子&#xff1a; 最近在一篇文章中了解到EFF(电子前哨基金会)为了推广https协议&#xff0c;成立了一个letsencrypt项目&#xff0c;可以发放免费的证书&#xff0c;此证书可以被大多数主流浏览器所信任&#xff0c;这个邪恶的念头一爆发&#xff0c;就让我走上了一条坎坷的不…

C# —— 序列化与反序列化

概念 序列化 通过使用不同的类(BinaryFormatter,SoapFormatter,XmlSerializer)将对象状态转换为可保持或传输的格式的过程,具体是将对象转变为字节流,其目的是为了保存数据的状态,方便后续还原调用。包括三种序列化形式:二进制序列化,SOAP序列化,XML序列化。于此过…