知识记录——Session与Cookie
Session:
Session是“会话”的意思,然而,因为http协议是无状态的,那么每次客户端请求服务器端,服务器端都会以“崭新”的页面展示给客户端,这在静态的html页面中是不会存在任何影响,但是在动态页面中,需要与用户交互,要保持与客户端用户的联系,则需要一些东西来保持,而Session的话,则是具有“保持状态,保持会话”的能力。Session是保存在服务器端的,Cookie是保存在客户端的。需要注意的是,如果用户突然关闭了客户端页面,那么Session就会丢失,即“会话丢失”。
服务器端创建session的三个步骤(网上参考):
1. 生成全局唯一标识符(sessionid);
2. 开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享;
3. 将session的全局唯一标示符发送给客户端。问题的关键就在服务端如何发送这个session的唯一标识上。联系到HTTP协议,数据无非可以放到请求行、头域或Body里,基于此,一般来说会有两种常用的方式:cookie和URL重写。
- Cookie(sessionid会保存在Cookie里,并且失效时间为0,就是浏览器进程的有效时间,如果关闭了浏览器,那么session就会失效,原理就是如此)读者应该想到了,对,服务端只要设置Set-cookie头就可以将session的标识符传送到客户端,而客户端此后的每一次请求都会带上这个标识符,由于cookie可以设置失效时间,所以一般包含session信息的cookie会设置失效时间为0,即浏览器进程有效时间。至于浏览器怎么处理这个0,每个浏览器都有自己的方案,但差别都不会太大(一般体现在新建浏览器窗口的时候);
- 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的应用
知识记录——Session与Cookie的更多相关文章
- node.js web开发:EXPRESS 4.x 以上使用session和cookie 的记录
关于session 和cookie 我搞了2-3天, 发现这个玩意也挺麻烦的. 很多教程都是把这种会话保存在nosql里面,比如mongo,或者redis等等.但是我还是想直接保存在计算机的内存中,比 ...
- Servlet基础知识(三)—— 会话机制Session,Session和Cookie的异同
Servlet会话机制: Http是一种无状态协议,它是无记忆的.也就是说,服务器不会保存用户的任何信息,当同一用户再次去访问时,服务器是不认识你的,它还是会建立新的连接. 但有时候我们需要服务器保留 ...
- 网路知识总结(session&&Cookie&&三次握手&&请求头)
1. 请说明Session和Cookie的作用和区别 1) Cookie 存在前端 前端需要拿着cookie访问后端,Session在服务器上(文件,数据库,如Redis) 2) web访问Serve ...
- session和cookie的知识总结
1.HTTP协议 由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接.HTTP服务器则在那个端口监听客户端发送过来的请求.一旦收到请求,服务器(向客户端)发回一个状态 ...
- 为什么说session依赖cookie,以及cookie的常用知识
session的用法 session在Flask中通常用做设置某些页面的权限,比如某些页面必须要登录才可以看到,登录的信息或标志就放到session中.它的使用过程如下: 在整个flask工程的启动文 ...
- 一个Login页面全面了解session与cookie
背景 做了四年的前端开发,对外一直说自己是web开发,那么身为一个web开发怎能不知道session与cookie以及其管理方式呢~ Login涉及技术栈:Nodejs,MongoDB,Express ...
- 再续session和cookie (网络整理)
摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...
- Web前端理论知识记录
Web前端理论知识记录 Elena· 5 个月前 cookies,sessionStorage和localStorage的区别? sessionStorage用于本地存储一个会话(session) ...
- Servlet体验之旅(二)——Session、Cookie
我们知道Session和Cookie都是用于会话跟踪的,仅仅是实现的方式不大一样,那么他们到底有什么不同呢?以下跟着我脚步来了解一下: Session.Cookie的含义: Session 一种ser ...
随机推荐
- android studio 3.0.1使用笔记(二)
发布前如何生成正式签名的APK? 一,查看APK签名方法:??Preferences->Android->Build可以查看到这个默认keystore文件的位置. 二,新建正式签名过程: ...
- django-redis缓存
1.安装django依赖包 pip install djange-redis==4.8.0 2.配置文件settings 需要开启redis服务 sudo service redis start,否 ...
- Python实践练习:选择性拷贝
题目 项目要求:编写一个程序,遍历一个目录树,查找特定扩展名的文件(诸如.pdf 或.jpg),不论这些文件的位置在哪里, 将它们拷贝到一个新的文件夹中. 代码 import os import sh ...
- windows解压缩版MySQL5.6.40的安装
windows解压缩版MySQL5.6.40的安装 安装步骤: 1.下载mysql-5.6.40-winx64.zip https://cdn.mysql.com//Downloads/MySQL-5 ...
- Nginx 前后端分离配置 分发
前端项目VUE 端口8081 , 后端项目JAVA 端口8080 # For more information on configuration, see: # * Official English ...
- _kbhit() for linux
传送门:http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html #include <stdio.h> #in ...
- CentOS装机必备-基本设置以及缺失文件
主要是虚拟机中安装CentOS每次总会做一些设置,记录下来方便以后. 纯粹基本设置,比如本地SecureCRT可以连接虚拟机中的CentOS. 复杂的非基本设置见:Linux 命令集锦 设置网络 自 ...
- VS2015 C#6.0 中的没有实现/支持的特性
VS2015 C#6.0 中的没有实现/支持的特性 .数组增强:赋值 维数组 Int[] numbers: numbers = {2,3,4,5}; 维数组 Int[,] numbers2; ...
- cas 退出后跳转指定页面
退出连接 https://localhost:8888/cas/logout?service=https://localhost:8080/cas-client/login 修改cas-server配 ...
- nyoj36-最长公共子序列 (LCS)
http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ...