当你看到 “会话” 这个词的时候,你会怎么理解呢?是交流、对话的意思吗?那毫无疑问绝对是的啦,只不过那是传统意义上的,或者说是日常生活中的意思,在计算机科学领域,它的意思就要引申一些了。在维基百科上是这样说的:
在计算机科学领域来说,尤其是在网络领域,会话(session,Microsoft Windows 中文版译作工作阶段)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在百度百科上是这样说的:
在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。
这两个说的其实是一个意思,就是说在终端和服务器端之间建立了一个关联,在关联有效期内的过程就是一次会话。(你可以理解成你给10086打电话,通电话期间就是一次会话)
Web应用中,会话指在一段时间内,一个用户通过浏览器与服务器之间进行的一些列的请求和响应的交互过程。 在一个会话中,用户可以访该Web应用系统中包括网页在内的多种资源。
当用户(浏览器)向Web应用服务器发送第一次请求时,服务器会为该用户创建一个唯一标识的会话,会话一直延续到访问结束(浏览器关闭或用户长时间不访问Web应用)。而JSP中使用session对象来表示会话,即将信息保存在session对象中,方便用户在这个会话中随时获取(读到这儿你好像感觉不出来,可能会用疑问:哪有什么session,我怎么就可以随时获取了?其实不然,你每次再一次访问(我指的是在当前浏览器窗口,新开的不算)该Web应用系统时,其实浏览器都默默的使用了该已被保存了的信息,下面我会细讲)。
浏览器关闭只是中断了和Web服务器的联系,但是session对象依然存在服务器终端(会有一个时常,通常为30min),如果时间超时,则Web服务器就会将其删除;如果服务器正常关闭,则将对象序列化到SESSIONS.ser文件内,当服务器重新启动,就会将该文件中session对象重新反序列化。
下面来说一下session的运行机制:
session的运行机制:
-
用户(浏览器)向Web应用服务器发送第一次请求时,请求头部中不包含sessionID(session唯一标识),则服务器会为该客户端创建一个新的session,并生成一个与此session对应的sessionID,然后将sessionID随着本次响应返回给客户端;
-
用户(浏览器)再次向Web应用服务器发送请求时,请求头部包含sessionID,则服务器首先会通过sessionID找到对应的session,以确定是这个客户端访问服务器,此时sessionID不会再次随着本次响应返回给客户端;如果该session因超出时长而被Web服务器删除,则重新创建一个新的session,并生成一个与此session对应的sessionID,然后将sessionID随着本次响应返回给客户端;
客户端没有禁用cookie的情况下,客户端使用cookie保存sessionID。如果cookie禁用,则会自动转化为用URL-rewriting(URL重写,URL中包含sessionID)技术实现。
如果哪位同志感兴趣自己试了一把(假如用百度页面去试),会发现,sessionID和上面的形式不一样了,其实不用大惊小怪,sessionID是很重要的东西,当然需要严格保密了!
下面再来补充一些session常用的方法:
session常用方法:
- setAttribute(“key”,“value”):设置指定名字的参数;session中保存的对象随着Tomcat服务器正常关闭(通过shutdown.bat关闭)而保存到work文件夹相应的目录中(Tomcat安装根目录\work\Catalina\localhost\xxx),随Tomcat的启动而重新使用。
- getAttribute(“key”):获取指定属性的值,如果该属性值不存在则返回null;
- removeAttribute(“key”):删除session中的一个属性;
- getID(“key”):获取sessionID;
- isNew():每个请求是否会产生新的session对象;
- setMaxInactiveInterval():设置停止操作后session对象的有效时间。
session与cookie比较:
session | cookie | |
---|---|---|
保存位置 | 服务器端 | 浏览器客户端 |
存储类型 | 对象 | 字符串 |
生命周期 | 随会话结束而关闭 | 可指定时长 |
存放信息重要性 | 重要信息 | 非重要信息 |