cookie and session

session 与 cookie

1. session解释: 浏览器会话期间,含义(面向连接和保持状态)

 javax.servlet.http.HttpSession 简称为session

 session机制:用来在客户端与服务器之间保持状态的解决方案

2. Http协议 与 状态保持

http协议本身无状态,每一次请求之间都是独立的,例子: 顾客 和 小商店 进行普通的交易,彼此都没记录过去的行为 

市场需求,按需生成动态信息使web服务变得更好,出现cookie,作用是对http无状态的努力,再后来的session是服务端与客户端保持状态的努力

例子理解 http协议 cookie session

顾客进咖啡店,咖啡店有历史总计满5杯送1杯的政策

 2.1 每个顾客进来,店员都知道该怎么对待。 ----相当于  协议支持状态

 2.2 顾客有消费卡,进店之后根据卡上消费记录,来对待是否优惠---客户端保持状态

 2.3 顾客有类似一张刷卡,上面只有卡号,顾客来消费时需要 店员在店内数据库中根据卡号 查找具体信息来 区别对待 ---服务端保持状态

由于http协议本身无状态,2.2 2.3 成为现实选择。

3. cookie机制

正统的cookie分发通过扩展http协议实现,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie; 客户端如果自己用js也可以生成cookie。

而cookie的使用是由浏览器按照一定的原则从后台自动发送给服务器,浏览器检查所有存储的cookie,把符合条件的cookie资源附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过期时间,路径和域。

4. session机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

    当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,

如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),

如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,

又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

保持会话方法:

    可以用cookie保存 session id,这样交互过程中,浏览器可以按照规则把 id 发回给服务端。

但cookie可以被客户端禁止,经常用到 URL重写(就是把session id直接附加在URL路径的后面),为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

还有一种是 服务端返回给客户端时,表单设隐藏字段,放session id

sessioni失效时间:

关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,

服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

HttpSession常见问题:转自:http://www.ideagrace.com/html/doc/2007/02/13/08632.html

1、session在何时被创建

  一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <%@page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。

  由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

  2、session何时被删除

  综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)

  3、如何做到在浏览器关闭时删除session

  严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

  4、有个HttpSessionListener是怎么回事

  你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是 session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

  5、存放在session中的对象必须是可序列化的吗

  不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。

  6、如何才能正确的应付客户端禁止cookie的可能性

  对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见[6]

http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

  7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

  参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。

  8、如何防止用户打开两个浏览器窗口操作导致的session混乱

  这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在 session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。

猜你喜欢

转载自xingzhiyang2016.iteye.com/blog/1959887