1. session机制:一类用来在客户端与服务器之间保持状态的解决方案
2. 在java中,session用来指代该语言的解决方案,如java中经常提及的HttpSession
3. Cookie与session的区别:
1) cookie用于在客户端保持状态,举例说明:
用户在咖啡店买五杯咖啡送一杯的优惠,咖啡店发给客户一张卡片,上边记录咖啡消费数量,一般存在活动有效期,每次消费时,如果客户出示该卡片,则此次消费与之前的消费和以后的消费相联系起来。此种做法则为在客户端保持状态,因为卡片在客户手上
2) session用于在服务端保持状态,举例说明:
咖啡店给用于发放一张会员卡,仅记录会员卡号,客户每次消费时,出示改卡,店员则会在会员卡记录本上找到这个卡号的消费记录,并添加本次消费记录。此种做法则为在服务端保持状态,因为会员卡相关记录信息由咖啡店维护。
由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择
3) cookie内容包括:名字,值,过期时间,路径,域
不设置有效期时,则表示该cookie的生命周期为浏览器会话期间,关闭浏览器,则该cookie消失。
4) session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
原理分析: 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识- 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
4. cookie工作流程:
>1. servlet创建cookie,保存少量数据,发送浏览器。
>2.浏览器获得服务器发送的cookie数据,将自动的保存到浏览器端。
>3. 下次访问时,浏览器将自动携带cookie数据发送给服务器。
5. cookie操作
>1.创建cookie:new Cookie(name,value)
>2.发送cookie到浏览器:HttpServletResponse.addCookie(Cookie)
>3.servlet接收cookie:HttpServletRequest.getCookies() 浏览器发送的所有cookie
6. cookie特点
>1. 每一个cookie文件大小:4kb, 如果超过4kb浏览器不识别
>2. 一个web站点(web项目):发送20个
>3.一个浏览器保存总大小:300个
>4.cookie 不安全,可能泄露用户信息。浏览器支持禁用cookie操作。
>5. 默认情况生命周期:与浏览器会话一样,当浏览器关闭时cookie销毁的。---临时cookie
7. cookie api
1> getName() 获得名称,cookie中的key
2> getValue() 获得值,cookie中的value
3> setValue(java.lang.String newValue) 设置内容,用于修改key对应的value值。
4> setMaxAge(int expiry) 设置有效时间【默认为-1】
5> setPath(java.lang.String uri) 设置路径【】
6> setDomain(java.lang.String pattern) 设置域名 , 一般无效,有浏览器自动设置,setDomain(".itheima.com"),www.itheima.com / bbs.itheima.com都可以访问,a.b.itheima.com无法访问,作用:设置cookie的作用范围,域名+路径在一起就构成了cookie的作用范围,上面单独设置的setPath有用,是因为有浏览器自动设置该域名属性,但是我们必须知道有这么个属性进行域名设置的
7> isHttpOnly() 是否只是http协议使用。只能servlet的通过getCookies()获得,javascript不能获得。
8> setComment(java.lang.String purpose) (了解)//对该cookie进行描述的信息(说明作用),浏览器显示cookie信息时能看到
9> setSecure(boolean flag) (了解) 是否使用安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的。
注意:cookie不能发送中文,如果要发送中文,就需要进行特别处理。
JDK提供工具,进行编码
URLEncoder:编码
URLDecoder:解码
//发送cookie
Cookie cookie = new Cookie(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));
response.addCookie(cookie);
//获得cookie中文内容
URLDecoder.decoder(request.getCookie().getName);//获取key
URLDecoder.decoder(request.getCookie().getValue);//获取value
8. session 操作:
1> 获取session:
request.getSession(); //等效于request.getSession(true),当未获取到对应的session时,创建一个新的session,若为fasle,则当未获取到session时,返回Null.(为什么要从request中获取session,可以理解为,在获取session时,需要检测请求中是否有session标识,所以需要用request来获取)。
2> 属性操作:
setAttrubute(key,value);
getAttribute(key);
用来存放一些信息,然后才能共享信息
3> 是否浏览器关闭,session就失效?
其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session,恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,一般是30分钟,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间
4> session有效时间控制:
1) session.invalidate() --> 手动将session对象销毁
2) .setMaxInactiveInterval(int interval) -->设置session失效时长,单位秒(默认30分钟)
3) 在web.xml中配置session的有效时长
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5> session的生命周期:
1) 创建:第一次调用getSession()
2) 销毁:销毁存在如下三种情况
-->超过session的有效时长
-->手动执行销毁操作
-->服务器非正常关闭(直接将jvm关闭)
6> 当浏览器禁用cookie时,基于cookie的session将不能正常工作,每次使用request.getSession()时都会创建一个新session,达不到session共享数据的目的,此时,只需要将session id传递给服务器session就可以正常。
解决方案:
手动方式: url + ;jsessionid=....
自动方式: encodeURL(java.lang.String url)进行所有URL重写
encodeRedirectURL(java.lang.String url) 进行重定向 URL重写
7> session持久化:
--> Session对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载 时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为Session对象的持久化。
--> 要完成session持久化,存放在session里的对象必须要实现java.io.Serializable 接口。Session的持久化是由Session Manager来管理的。Tomcat提供了两个实现类:
org.apache.catalina.session.StandardManager (默认)
org.apache.catalina.session.PersistentManager (暂时不看)
--> tomcat默认启用持久化配置,若要禁用,则需要在tomcat下的conf文件夹下的context.xml中的<Context>节点里配置<Manager pathname=”” />
--> StandardManager (StandardManager是默认的Session Manager。它的实现机制为:当Tomcat服务器关闭或重启,或者Web应用被重新加载时,会对在内存中的HttpSession对象进行持久化, 并把它们保存到文件系统中,默认的文件为<CATALINA_HOME>/work/Catalina/hostname/ applicationname/SESSIONS.ser。)
1) 全局配置: context.xml中配置如下标签
<Manager
className=”org.apache.catalina.session.StandardManager”
debug=”0”
maxInactiveInterval=”-1″
/>
2) 针对某一站点配置则需要在cof文件夹server.xml的<Host><Context>
节点中添加<Manager>配置。
9. 总结:
>>>cookie是一种在客户端记录用户信息的技术,因为http协议是无状态的,为了解决这个问题而产生了cookie。记录用户名等一些应用信息
>>>session是一种在服务端记录用户信息的技术,一般session用来在服务器端共享数据
>>>cookie工作原理:cookie是由服务器端创建发送回浏览器端的,并且每次请求服务器都会将cookie带过去,以便服务器知道该用户是哪一个。其cookie中是使用键值对来存储信息的,并且一个cookie只能存储一个键值对。所以在获取cookie时,是会获取到所有的cookie,然后从其中遍历。
>>>session的工作原理就是依靠cookie来做支撑,第一次使用request.getSession()时session被创建,并且会为该session创建一个独一无二的sessionid存放到cookie中,然后发送会浏览器端,浏览器端每次请求时,都会带着这个sessionid,服务器就会认识该sessionid,知道了sessionid就找得到哪个session。以此来达到共享数据的目的。 这里需要注意的是,session不会随着浏览器的关闭而死亡,而是等待超时时间。
Cookie存储位置不同的影响:
内存cookie,是指没有设在cookie的Expires的属性,此时cookie将停留在客户端的内存中,只有在该IE窗口中从“文件-新建- 窗口”打开的新的IE窗和由form的target属性为_blank产生的新的IE窗口才共享同一个cookie信息。IE,Chome的选项卡都共享同一个cookie信息。
硬盘cookie,是指在你设置了cookie的Expires属性,此时cookie将保存到你的硬盘上,Win7是在C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies 下面(如果你是Administrator账号的话)。此时所有的窗口将共享同一个名字的cookie。