mobaxterm保存会话记录_深入学习JavaWeb(三):会话机制,Cookie和Se...
mobaxterm保存会话记录_深⼊学习JavaWeb(三):会话机
制,Cookie和Se。。。
旧欢如梦 李克勤
本⽂转⾃与博客园⼀杯凉茶的博客.
很⼤⼀部分应该知道什么是会话机制,也能说的出⼏句,我也⼤概了解⼀点,但是学了之后⼏天不⽤,⽴马忘的⼀⼲⼆净,原因可能是没能好好理解这两种会话机制,所以会⼀直遗忘,⼀直重新回过头来学习它,今天好好把他总结⼀下,借鉴该⽂章中的内容,因为我觉得该篇⽂章确实写的很不错,解答了我很多疑问,特点是对cookie和session的理解,其中的会员卡的例⼦,真是⼀针见⾎的奇效。我按照⾃⼰的思路来重新整理⼀份,给⾃⼰以后看。
⼀、会话机制
Web程序中常⽤的技术,⽤来跟踪⽤户的整个会话。常⽤的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定⽤户⾝份,Session通过在服务器端记录信息确定⽤户⾝份。
⼀次会话指的是:就好⽐打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,⽽浏览器访问服务器,就跟打电话⼀样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话⼀样),都视为⼀次会话,直到浏览器
关闭,本次会话结束。其中注意,⼀个浏览器就相当于⼀部电话,如果使⽤⽕狐浏览器,访问服务器,就是⼀次会话了,然后打开google浏览器,访问服务器,这是另⼀个会话,虽然是在同⼀台电脑,同⼀个⽤户在访问,但是,这是两次不同的会话。
知道了什么是会话后,思考⼀个问题,⼀个浏览器访问⼀个服务器就能建⽴⼀个会话,如果别的电脑,都同时访问该服务器,就会创建很多会话,就拿⼀些购物⽹站来说,我们访问⼀个购物⽹站的服务器,会话就被创建了,然后就点击浏览商品,对感兴趣的商品就先加⼊购物车,等待⼀起付账,这看起来是很普通的操作,但是想⼀下,如果有很多别的电脑上的浏览器同时也在访问该购物⽹站的服务器,跟我们做类似的操作呢?服务器⼜是怎么记住⽤户,怎么知道⽤户A购买的任何商品都应该放在A的购物车内,不论是⽤户A什么时间购买的,不能放⼊⽤户B或⽤户C的购物车内的呢?所以就有了cookie和session这两个技术,就像第⼀⾏说的那样,cookie和session⽤来跟踪⽤户的整个会话,
Cookie和Session之间的区别和联系
假如⼀个咖啡店有喝5杯咖啡免费赠⼀杯咖啡的优惠,然⽽⼀次性消费5杯咖啡的机会微乎其微,这时就需要某种⽅式来纪录某位顾客的消费数量。想象⼀下其实也⽆外乎下⾯的⼏种⽅案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客⼀⾛进咖啡店,店员就知道该怎么对待了。这种做法就是协议本⾝⽀持状态。但是http协议本⾝是⽆状态的
许玮甯拒绝阮经天求婚
2、发给顾客⼀张卡⽚,上⾯记录着消费的数量,⼀般还有个有效期限。每次消费时,如果顾客出⽰这张卡⽚,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。也就是cookie。 顾客就相当于浏览器,cookie如何⼯作,下⾯会详细讲解
3、发给顾客⼀张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出⽰该卡⽚,则店员在店⾥的纪录本上到这个卡号对应的纪录添加⼀些消费信息。这种做法就是在服务器端保持状态。
由于HTTP协议是⽆状态的,⽽出于种种考虑也不希望使之成为有状态的,因此,后⾯两种⽅案就成为现实的选择。具体来说cookie机制采⽤的是在客户端保持状态的⽅案,⽽session机制采⽤的是在服务器端保持状态的⽅案。同时我们也看到,由于采⽤服务器端保持状态的⽅案在客户端也需要保存⼀个标识,所以session机制可能需要借助于cookie机制来达到保存标识的⽬的,但实际上它还有其他选择
⼆、Cookie
上⾯已经介绍了为什么要使⽤Cookie,以及Cookie的⼀些特点,⽐如保存在客户端,⽤来记录⽤户⾝份信息的,现在来看看如何使⽤Cookie。
借着上⾯会员卡的例⼦来说,采⽤的是第⼆种⽅案,其中还需要解决的问题就是:如何分发会员卡,会员卡的内容,客户如何使⽤会员卡,会员卡的有效⽇期,会员卡的使⽤范围
1、如何分发会员卡、会员卡的内容:也就是cookie是如何创建的?创建后如何发送给客户端?
由服务器进⾏创建,也就相当于咖啡店来创建会员卡,在创建会员卡的同时,就会将会员卡中的内容也给设置了
Cookie cookie = new Cookie(key,value); //以键值对的⽅式存放内容,
response.addCookie(cookie); //发送回浏览器端
注意:⼀旦cookie创建好了,就不能在往其中增加别的键值对,但是可以修改其中的内容,
cookie.setValue(); //将key对应的value值修改
2、客户如何使⽤会员卡,cookie在客户端是如何⼯作的,⼯作原理是什么?
这个过程就相当于,咖啡店创建好了会员卡,并且已经设置了其中的内容,交到了客户⼿中,下次客户过来时,就带着会员卡过来,就知道你是会员了,然后咖啡店就拿到你的会员卡对其进⾏操作。
3、会员卡的有效⽇期?也就是cookie也是拥有有效⽇期的。
这个可以⾃由设置,默认是关闭浏览器,cookie就没⽤了。
2022年春节是哪天?
cookie.setMaxAge(expiry); //设置cookie被浏览器保存的时间。
expiry:单位秒,默认为-1,
expiry=-1:代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了。
expiry>0:代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器⾃动删除,
expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。
4、会员卡的使⽤范围?⽐如星巴克在北京有⼀个分店,在上海也有⼀个分店,我们只是在北京的星
巴克办理了会员卡,那么当我们到上海时,就不能使⽤该会员卡进⾏打折优惠了。⽽cookie也是如此,可以设置服务器端获取cookie的访问路径,⽽并⾮在服务器端的web项⽬中所有的servlet都能访问该cookie。
cookie默认路径:当前访问的servlet⽗路径。
默认路径:/test01/a/b/c 也就是说,在该默认路径下的所有Servlet都能够获取到cookie,/test01/a/b/c/MyServlet 这个MyServlet就能获取到cookie。
修改cookie的访问路径
setPath("/"); //在该服务器下,任何项⽬,任何位置都能获取到cookie,
十月英文缩写通途:保证在tomcat下所有的web项⽬可以共享相同的cookie
例如:tieba , wenku , beike 多个项⽬共享数据。例如⽤户名。
setPath("/test01/"); //在test01项⽬下任何位置都能获取到cookie。
5、总结Cookie:
⼯作流程:
1. servlet创建cookie,保存少量数据,发送浏览器。
2. 浏览器获得服务器发送的cookie数据,将⾃动的保存到浏览器端。
3. 下次访问时,浏览器将⾃动携带cookie数据发送给服务器。
cookie操作
1.创建cookie:new Cookie(name,value)有意义的话
2.发送cookie到浏览器:HttpServletResponse.addCookie(Cookie)
3.servlet接收cookie:Cookies() 浏览器发送的所有cookie
cookie特点
1. 每⼀个cookie⽂件⼤⼩:4kb , 如果超过4kb浏览器不识别
2. ⼀个web站点(web项⽬):发送20个
3.⼀个浏览器保存总⼤⼩:300个
混凝土施工工艺
5. 默认情况⽣命周期:与浏览器会话⼀样,当浏览器关闭时cookie销毁的。---临时cookie
cookie api
getName() 获得名称,cookie中的key
getValue() 获得值,cookie中的value
setValue(java.lang.String newValue) 设置内容,⽤于修改key对应的value值。
setMaxAge(int expiry) 设置有效时间【】
setPath(java.lang.String uri) 设置路径【】
setDomain(java.lang.String pattern) 设置域名 , ⼀般⽆效,有浏览器⾃动设置,setDomain(".itheima")
www.itheima / bbs.itheima 都可以访问
a.b.itheima⽆法访问
作⽤:设置cookie的作⽤范围,域名+路径在⼀起就构成了cookie的作⽤范围,上⾯单独设置的setPath有⽤,是因为有浏览器⾃动设置该域名属性,但是我们必须知道有这么个属性进⾏域名设置的
isHttpOnly() 是否只是http协议使⽤。只能servlet的通过getCookies()获得,javascript不能获得。
setComment(java.lang.String purpose) (了解) //对该cookie进⾏描述的信息(说明作⽤),浏览器显⽰cookie信息时能看到
setSecure(boolean flag) (了解) 是否使⽤安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,⽽http时不会,但是服务端还是可以发送给浏览端的。
setVersion(int v) (了解) 参数为0(传统Netscape cookie规范编译)或1(RFC 2109规范编译)。这个没⽤到,不是很懂
注意:cookie不能发送中⽂,如果要发送中⽂,就需要进⾏特别处理。
JDK提供⼯具,进⾏编码
URLEncoder:编码
URLDecoder:解码
//发送cookie
Cookie cookie = new de("哈哈"),de("呵呵"));
response.addCookie(cookie);
//获得cookie中⽂内容
URLDecoder.Cookie().getName); //获取key
URLDecoder.Cookie().getValue); //获取value
6.1、记住⽤户名
登录时,在服务器端获取到⽤户名,然后创建⼀个cookie,将⽤户名存⼊cookie中,发送回浏览器端,然后浏览器下次在访问登录页⾯时,先拿到cookie,将cookie中的信息拿出来,看是否保存了该⽤户名,如果保存了,那么直接⽤他,如果没有,则⾃⼰⼿写⽤户名。
6.2、历史记录
⽐如购物⽹站,都会有我们的浏览记录的,实现原理其实也是⽤cookie技术,每浏览⼀个商品,就将其存⼊cookie中,到需要显⽰浏览记录时,只需要将cookie拿出来遍历即可。
三、Session
同样,会员卡的例⼦的第三种⽅法,发给顾客⼀张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出⽰该卡⽚,则店员在店⾥的纪录本上到这个卡号对应的纪录添加⼀些消费信息。这种做法就是在服务器端保持状态。 这就是session的⽤法,在服务器端来保持状态,保存⼀些⽤户信息。
功能作⽤:服务器⽤于共享数据技术,
session原理分析:
⾸先浏览器请求服务器访问web站点时,程序需要为客户端的请求创建⼀个session的时候,服务器⾸先会检查这个客户端请求是否已经包含了⼀个session标识、称为SESSIONID,如果已经包含了⼀个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使⽤,如果客户端请求不包含session id,则服务器为此客户端创建⼀个session并且⽣成⼀个与此session相关联的session id,sessionid 的值应该是⼀个既不会重复,⼜不容易被到规律以仿造的字符串,这个sessionid将在本次响应中返回到客户端保存,保存这个sessionid的⽅式就可以是cookie,这样在交互的过程中,浏览器可以⾃动的按照规则把这个标识发回给服务器,服务器根据这个sessionid就可以得到对应的session,⼜回到了这段⽂字的开始。
获取session:
有些⼈不理解,为什么是通过request来获取session,可以这样理解,在获取session时,需要检测请求中是否有session标识,所以需要⽤request来获取
session属性操作:
xxxAttribute(...)
⽤来存放⼀些信息,然后才能共享信息
setAttrubute(key,value);
getAttribute(key);
session⽣命周期
常常听到这样⼀种误解“只要关闭浏览器,session就消失了”。其实可以想象⼀下会员卡的例⼦,除⾮顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是⼀样的,除⾮程序通知服务器删除⼀个session,否则服务器会⼀直保留,程序⼀般都是在⽤户做log off的时候发个指令去删除session。然⽽浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是⼤部分session机制都使⽤会话cookie来保存session id,⽽关闭浏览器后这个session id就消失了,再次连接服务器时也就⽆法到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使⽤某种⼿段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够到原来的session
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了⼀个失效时间,⼀般是30分钟,当距离客户端上⼀次使⽤session的时间超过这个失效时间时,服务器就可以认为客户端已经停⽌了活动,才会把session删除以节省存储空间
我们也可以⾃⼰来控制session的有效时间
session.invalidate()将session对象销毁
setMaxInactiveInterval(int interval) 设置有效时间,单位秒
在l中配置session的有效时间
30 单位:分钟
所以,讨论了这么就,session的⽣命周期就是:
创建:第⼀次调⽤getSession()
销毁:
1、超时,默认30分钟
2、执⾏api:session.invalidate()将session对象销毁、setMaxInactiveInterval(int interval) 设置有效时间,单位秒
3、服务器⾮正常关闭
⾃杀,直接将JVM马上关闭
如果正常关闭,session就会被持久化(写⼊到⽂件中,因为session默认的超时时间为30分钟,正常关闭后,就会将session持久化,等30分钟后,就会被删除)
位置: D:javaomcatapache-tomcat-7.0.53workCatalinalocalhostest01SESSIONS.ser
session id的URL重写
当浏览器将cookie禁⽤,基于cookie的session将不能正常⼯作,每次使⽤Session() 都将创建⼀个新的session。达不到session共享数据的⽬的,但是我们知道原理,只需要将session id 传递给服务器session就可以正常⼯作的。
解决:通过URL将session id 传递给服务器:URL重写
⼿动⽅式: url;jsessionid=....
api⽅式:
encodeURL(java.lang.String url) 进⾏所有URL重写
encodeRedirectURL(java.lang.String url) 进⾏重定向 URL重写
这两个⽤法基本⼀致,只不过考虑特殊情况,要访问的链接可能会被Redirect到其他servlet去进⾏处理,这样你⽤上述⽅法带来的session的id 信息不能被同时传送到其他servlet.这时候⽤encodeRedirectURL()⽅法就可以了
如果浏览器禁⽤cooke,api将⾃动追加session id ,如果没有禁⽤,api将不进⾏任何修改。
注意:如果浏览器禁⽤cookie,web项⽬的所有url都需进⾏重写。否则session将不能正常⼯作
当禁⽌了cookie时,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。