⾯试题:cook和session
1、⾸先,Cookie与Session存在的⽬的是什么?
答:⼆者都是为了保持客户端访问⽤户与后台服务器的交互状态,之所以为了保持这种状态,⼀是为了⽅便⼀些业务的实现,另⼀⽅⾯就是为了简化后台服务端的程序设计,提⾼性能。
2、如何理解Cookie?
答:我理解的Cookie,就是服务器端⽤来区分访问⽤户的,⼀个⽤户发出HTTP请求,服务端判断这个⽤户是不是第⼀次访问,如果是新⽤户,那么就得先登记,然后把这个⽤户的⼀些信息⽤Key-Value键值对的形式保存起来,通过HTTP响应让⽤户带回客户端,让⽤户保存着,下次访问时,捎带着把信息也带过来,⼀看是⽼熟⼈,后台就不⽤登记直接处理业务了,⽅便⽽有效率。
3、如何理解Session?
答:Cookie是保存在客户端的,⽽客户端保存Cookie是有数量和⼤⼩限制的,那我们就想,服务器端信息是可以保存很多很多的,这就有了Session。
我们在新客户访问时,就可以把信息登记然后保存在服务器,给⽤户⼀个唯⼀的信息标识就好了(⼀般
是⼀个NAME为JSESSIONID的Cookie),下次⽤户访问的时候,只需要出⽰信息标识,后台就可以把他其他信息全部取出来(也就是把Session取出来),然后进⾏业务就好,防⽌了信息的篡改丢失等问题,⽽且没有容量限制。
4、Session如何基于Cookie⼯作?
答:刚刚说道对Session的理解时,提到⼀个Session的标识(⼀般是⼀个NAME为JSESSIONID的Cookie),这个标识⼀般是⽤Cookie保存在客户端⽤来维持Session的,但这是Cookie允许被使⽤的情况,如果Cookie被禁⽤,将会默认使⽤URL Parameter实现。
具体实现流程:
a、客户端第⼀次发出请求,因为服务端并不知道Cookie是否可⽤,所以服务端准备⼀个测试⽤的NAME为JSESSIONID的Cookie作为客户Session的标识,并将HTTP响应中的URL参数改写,在尾部加上JSESSIONID,返回响应。
b、客户端再次发出请求时,就会包含Cookie是否可⽤的信息,如果可⽤,则优先使⽤Cookie保存JSESSIONID,并会覆盖URL中的ID,如不可⽤,就⽤URL Parameter改写的⽅式实现JSESSIONID的传递,以维持Session。
c、当浏览器关闭或Session过期后,Cookie也就失效了。
5、如何配置SessionCookieName?
答:默认的SessionCookieName就是JSESSIONID,我们可以在l中配置session-config项,其中cookie-config下的name属性就是这个SessionCookieName,可以由⽤户⾃⼰定义。
session如何设置和读取
6、Session如何⼯作?
答:在通过问题4中的⽅法获得Session标识后,就可以通过Session()获得HttpSession对象了,如果这个Session标识没有对应HttpSession时,那么就创建⼀个新的。
那么由谁管理HttpSession对象?
表⾯上,所有的HttpSession就会被加⼊到org.apache.catalina.Manager的sessions容器中保存,这个Manager类会管理所有Session的⽣命周期。Session过期了会被回收。
更具体的是,StandardManager是Manager的实现类,对应的,StandardSession是HttpSession的实现类;StandardManager类负责Servlet 容器中所有StandardSession对象的⽣命周期的管理。
如果Session没有过期,⽽服务器关闭了,Session还会存在吗?
只要是正常关闭服务器,在关闭之前,StandardManager会把所有没有过期的StandardSession持久化到⼀个名为“SESSION.ser”的⽂件中,当Servlet重启时,StandardManager初始化,会重新读取这个⽂件解析出所有Session对象,重新保存在StandardManager中的sessions集合中,session恢复。
但是,当⾮正常关闭服务器时,是没有时间持久化Session的,就会导致Session丢失。
7、Cookie与Session有何缺陷?
任何事情都有两⾯性,他们的存在也带来了⼀些挑战,如Cookie的容量问题(⼤⼩、数量限制)、安全问题(易被篡改)、Session的服务器共享问题。

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