JavaWeb—Session与Cookie
概念
会话:指从一个浏览器窗口打开到关闭期间的一系列动作(可简单理解为用户开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器)。
HTTP协议是无状态协议:每次连接(比如同一个网站的多个页面)一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,而Session和Cookie就是为解决这个问题而提出来的两个机制。
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
Cookie
Cookie实际上是保存在客户端的一小段的文本信息。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。
- Name 和 Value 属性由程序设定,默认值都是空引用。
- Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。
- Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。
- Expires 属性,这个属性设置此Cookie 的过期日期和时间。
HttpCookie cookie = new HttpCookie("MyCook");//初使化并设置Cookie的名称
DateTime dt = DateTime.Now;
TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//过期时间为1分钟
cookie.Expires = dt.Add(ts);//设置过期时间
cookie.Values.Add("userid", "value");
cookie.Values.Add("userid2", "value2");
Response.AppendCookie(cookie);
Path和Domain属性
Path:
Path就是跟在域名后面的URL路径,是在服务器创建Cookie时设置的,它的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器。假如有下面三个cookie:
- Cookie1 路径:/Example/cookie
- Cookie2 路径:/Example/
- Cookie3 路径:/Example111/cookie
当浏览器访问服务器端的路径为:”http://localhost:8080/Example/cookie/a/index.jsp“时,也就是说index.jsp页面的访问路径为:”/Example/cookie/a/“,该路径包含了Cookie1和Cookie2的路径,因此在访问index.jsp时,浏览器会将Cookie1和Cookie2发送给服务器。
Domain:
Domain就是指的域名,一般是在多个二级域名共享cookie时才会使用,例如:
tieba.baidu.com news.baidu.com 这些域可以理解为百度的子项目,那么现在需要在百度的所有二级域名中去共享cookie,这个时候就需要设置cookie的域和路径:
- 设置cookie的域:setDomain(“.baidu.com”),目的是对百度的所有二级域名有效;
- 设置cookie的路径为根路径:setPath(“/”),目的是此路径下面的所有访问路径都带着这个cookie;
会话Cookie和持久Cookie
若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。
Cookie具有不可跨域名性
就是说,浏览器访问百度不会带上谷歌的cookie。
Session
Session是存在服务器的一种用来存放用户数据的类HashTable结构。
当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。
session的创建
当服务端需要为某个客户端的请求创建一个session时,服务端首先检查这个客户端的请求里是否已包含了Session ID,如果已包含则说明以前已经为此客户端创建过session,服务器就按照Session ID把这个session检索出来使用,如果客户端请求不包含Session ID,则为此客户端创建一个session并且生成一个与此session相关联的Session ID,Session ID的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session ID将被在本次响应中返回给客户端保存。
一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用。
session对象默认失效时间是30分钟,可以在web.xml文件中可以手工配置session的失效时间。
Session的客户端实现形式(即Session ID的保存方法)
一般浏览器提供了两种方式来保存,还有一种是程序员使用HTML隐藏域的方式自定义实现:
- 使用Cookie来保存,这是最常见的方法。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
- 使用URL附加信息的方式,就是把Session ID直接附加在URL路径的后面。表现形式为“http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764”
- 表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
如果客户端的浏览器禁用了Cookie,则使用第2、3种方式。
总结
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
参考:
javaweb学习总结(十一)——使用Cookie进行会话管理
JavaWeb—Session与Cookie的更多相关文章
- javaweb学习——session和Cookie实现购物车功能
1.创建Book类,实现对图书信息的封装. package cn.it.sessionDemo.example1; import java.io.Serializable; /** * 该类实现对图书 ...
- JavaWeb基础-Session和Cookie
JSP状态管理 http的无状态性,服务器不会记得发送请求的浏览器是哪一个 保存用户状态的两大机制:session和cookie Cookie:是web服务器保存在客户端的一系列文本信息 作用:对特定 ...
- JavaWeb基于session和cookie的数据共享
在了解session和cookie技术之前,我们需要先了解一下什么是会话?会话可以简单理解为用户打开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程称为一个会话.这样, ...
- JavaWeb -- 会话, Cookie 和 Session
1. 会话 •Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是 ...
- Session、Cookie 学习笔记
在开始今天的博文之前首先为自己庆祝一下自己有了三个粉丝,也有了同僚的评论,说实话因为这个开心了好久!哈哈,好了在开始今天的正题之前,首先大家需要了解以下几点: a. HTTP 协议是无状态的协议,WE ...
- Javaweb Session机制(有待补充)
Javaweb Session机制 一.前言 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个ses ...
- Java Web 深入分析(9) Session 和 Cookie
前言: session 和cookie都是为了保持服务器和客户端之间交互状态.如果一天的PV有几亿,而一个cookie占200个字节但是也会占用很多带宽?所以大访问量就引用session,但是几百台服 ...
- 理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...
- PHP之session与cookie
1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...
随机推荐
- kafka_2.11-0.10.2.1中的auto.offset.reset
在使用spark连接kafka消费topic时,发现无论怎么设置,也无法从头开始消费. 查看配置得出auto.offset.reset的以下3种设置及含义: earliest 当各分区下有已提交的of ...
- java 错误汇总
一.怎么处理警告:编码 GBK 的不可映射字符 解决办法是:应该使用-encoding参数指明编码方式:javac -encoding UTF-8 XX.java,这下没警告了,运行也正确了在JCre ...
- 关于跨平台的理解以及Unity的由来--Unity学习
1.在2000到2003年的时候,掀起了一阵Java跨平台的浪潮,Java本来是在自己的Java机器上运行的,这时候出现了一个叫Java虚拟机的东西,Java虚拟机可以在Windows系统中运行,这样 ...
- 【SPOJ】8222. Substrings(后缀自动机)
http://www.spoj.com/problems/NSUBSTR/ 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 这题 ...
- hdu 2717:Catch That Cow(bfs广搜,经典题,一维数组搜索)
Catch That Cow Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1392:Surround the Trees(计算几何,求凸包周长)
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- PowerShell中的配置文件
http://www.cnblogs.com/ceachy/archive/2013/03/01/PowerShell_Profile.html
- NPOI导出Excle
前端: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" con ...
- 工作流JBPM_day01:1-说明_MyProcessDesigner_流程设计器
工作流JBPM_day01:1-说明 先只做请假功能,怎么做? (请假可以和考勤整合到一起) 1,银行(拿号---叫号---办理) 2,餐馆(点菜---上菜---结账) 3,网购(下订单--配送--收 ...
- 你所不知道的CSS
1.用FONT-SIZE:0来清除间距 inline-block的元素之间会受空白区域的影响,也就是元素之间差不多会有一个字符的间隙.如果在同一行内有4个25%相同宽度的元素,会导致最后一个元素掉下来 ...