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打开的窗口里做修改操作,这样就可以不用设置。
相关推荐
cookieAndsession.zip
非常适合于初学者的cookie and session例,已测试通过
node.js+koa框架+nunjucks实现的登录验证
NULL 博文链接:https://panjiangchuan.iteye.com/blog/831989
7.Cookie and Session 列表 8.键盘键值查询 =============================================================== 没有任何演示,目前还在扩展一些功能。基本使用非常简便,不必再加说明。感谢支持!
:hammer_and_pick: SvelteKit的加密“无状态” cookie会话 通过此后端实用程序,您可以创建会话,并通过加密的印章将其存储在浏览器cookie中。 这提供了强大的客户端/“无状态”会话。 从客户端的角度来看,存储在...
NULL 博文链接:https://jyjiao2007.iteye.com/blog/758447
关于asp.net的需要讲解,对session and cookies的讲解很精简。
Warning session_start() [function.session-start] Cannot send session cookie解决办法
* Sets a Cookie with the given name and value. * * name Name of the cookie * value Value of the cookie * [expires] Expiration date of the cookie (default: end of current session) * [path] Path where ...
In this paper, we explain why session management (and session management security) is a complex task (which is why it is usually left for commercial products). We describe how the tokens are generated...
:hammer_and_wrench: Next.js和Express(连接中间件)无状态会话实用程序,使用签名和加密的cookie来存储数据 这个 , 和后端实用程序允许您创建一个会话,然后通过签名和加密的印章将其存储在浏览器cookie中。 这...
Resolved issue 1310: ChromeDriver hangs (and times out) when inspecting inactive background pages [['OS-All', 'Pri-2']] Resolved issue 824: ChromeDriver creates two cookies when the cookie to add ...
Bulletproof SSL and TLS by Ivan Ristić Table of Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
name -cookie中会话令牌密钥的名称(默认为session ) sessions -一个实例的LevelUp在存储会话默认为 。 请注意,默认情况下不会处理到期时间/ ttl 您必须传递自己的“身份验证器”功能,如下所示: function ...
其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,做法是第一次数据请求时就获取sessionid的值并...
cookie-parser的作用,官方的说法是:Parse Cookie header and populate req.cookies with an object keyed by the cookie names.我的理解是,转换headers中的cookie并跟req.cookies合并。作为cookie-parser的核心,...
第一次数据请求时就获取这个cookie的名称并且得到这个cookie的值,这个即是sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个sessionid一并放在Cookie中发给服务器,服务器则是通过这个...
usage: fantiadl.py [options] urlpositional arguments: url fanclub or post URLoptional arguments: -h, --help show this help message and exit -c SESSION_COOKIE, --cookie SESSION_COOKIE _session_id ...
BINDSTATUS_PERSISTENT_COOKIE_RECEIVED = BINDSTATUS_SESSION_COOKIE_RECEIVED + 1; - Added IE8 constants: BINDSTATUS_COOKIE_DATA = BINDSTATUS_SSLUX_NAVBLOCKED + 1; //IE8 BINDSTATUS_SERVER_...