会话是客户端发送请求,服务器返回响应的连接时间段。
HTTP是无状态协议:每次都是单独连接,不能维持客户的上下文信息。
会话跟踪技术是用于维持客户端和服务器端通信信息的技术。
三种典型客户端会话跟踪解决方案:1,Cookie;
2,URL重写;
3,隐藏表单域;
二,会话Cookie
1、用于会话跟踪的Cookie叫做会话Cookie。Servlet规范中会话跟踪的cookie名字必须是JSESSIONID,保存在浏览器的内存中。 区别于保存在外部存储设备的cookie。
2、利用Cookie保存登录用户的用户信息(如账户和密码)等敏感信息有很大的安全隐患,比如在公共机子上上网,当一个用户走之后,他人很容易的从Cookie文件中轻松获得的账号和信息,后果不敢设想。另外,由于Cookie在网上是以明文传输的,所以也很容易被他人截取或篡改,当然很多场商利用这些特点,根据用户的上网习惯进行数据挖掘,进行进一步开发。
所以在开发WEB应用程序时,需要在用户机子上保存用户名和密码等信息,应该提示一下用户,另外对于密码等敏感信息,应该进行加密的方式进行存储。
3、 对于存储在内存中的cookie,是不能被不同的浏览器进程共享,共享只能发生在同一个浏览器进程的不同窗口(对个窗口共享一个进程)中。对于存储在外部设备的cookie,可以多浏览器共享。
4、对于保存在硬盘上的Cookie,因为在外部存储设备中存储,所以可以在多个浏览器中共享。
5、错误的观点“浏览器一关闭,session就会消失!”
因为保存Session的Cookie存储在浏览器内存中,一旦关闭浏览器,Cookie 就被删除,sessionID就被删除了,所以再次打开浏览器连接服务器登录的时候,应为没有了 sessionID,就无法找到先前的session,于是服务器有重新建立了一个session,但这时先前的session仍然存在,直到超过了设置的时间,该session才自动消失。
6、Cookie对象的setMaxAge()可以设置cooike的最大生存时间。如果设置为0表示删除Cookie;负数表示给关闭浏览器,Cookie就会消失;正数表示Cookie参数会保存在硬盘上。
三,url重写
1、在浏览器不支持或禁用cookie的情况下,使用url重写代替cookie来跟踪用户会话。
2、每个页面都必须使用servlet或jsp动态生成(动态页面)。因为附加在URL上的sessionID是动态产生,所以对于静态页面的跳转,URL重写机制无能为力。
3、即使使用动态页面,如果用户离开了会话并且通过书签或链接再次回来,会话信息也会丢失,因为存储下来的链接含有错误的标识信息。
4、必须将所有发送到客户端的url进行编码,调用HttpServletResponse接口中的encodeURL()方法和encodeRedirectURL()方法来实现。在调用sendRedirect()方法之前使用encodeRedirectURL()方法.
四,servlet中的会话跟踪
javax.servlet.http.HttpSession接口是servlet提供会话跟踪解决方案。
HttpSession对象存放在服务器端,只是对cookie和url重写技术的封装应用,所以要求服务器支持cookie,可以全局切换到url重写。
1,访问与当前请求相关联的会话对象:getSession()方法
在会话过程中,web容器负责为客户端维护一个唯一的HttpSession对象。
对于新会话,web容器创建使用实现了HttpSession接口的HttpSession对象封装当前请求会话的信息。
在后台,系统从cookie或URL重写附加的数据中提取出用户ID。以ID为key,遍历之前创建的HttpSession对象内建值。
如果找不到匹配的会话ID,系统重新创建一个新的会话。默认情况下(不禁用Cookie)还会创建一个名为JSESSIONID,值为唯一标识用户表示会话ID的输出cookie。
区别:getSession(boolean value)方法:如果系统没有找到与请求关联的会话ID,true表示返回新会话。false表 示方法返回null。
getSession()方法会影响到后面的响应,所以只能在发送任何文档内容到客户端之前调用getSession()方法。
2,访问和设置与会话相关联信息,维护会话的状态:HttpSession的getAttribute()方法和setAttribute()方法
散列表:HttpSession对象内建数据结构,用于存储 当前请求会话的数据(会话的属性)。可以存储任意数量的key-value对。
使用HttpSession的getAttribute()方法和setAttribute(String key,Object value)方法读取和设置当前请求会话数据(即对散列表的操作),维护会话的状态。
setAttribute方法会替换任何之前的属性。如果不想被替换,则需要在设置之前使用removeArrtibute(Stringkey)方法移除该属性。
setAttribute方法会触发所有实现了HttpSessionBindingListener接口的valueBound方法,做一些初始化状态的操作。
removeArrtibute方法会触发所有实现了HttpSessionBindingListener接口的valueUnbound方法,做一些消除状态的操作。
对于分布式WEB应用程序,将web应用程序标记为可分布式执行,系统需要能够将会话对象在机器之间传递,这时需要将会话的属性实现Serializable接口。
3,废弃会话数据
只移除自己编写的的servlet创建的数据:removeArrtibute(String key)方法
(web应用程序中删除)删除整个会话:invalidate()方法,可以用该方法注销用户。
(Web服务器中删除)将用户从系统中注销并且删除所有与该会话关联的会话:logout()方法。一定要与其他web应用程序协调loggout命令的使用。
4,会话超时时间间隔
getMaxInactiveInterval()方法和setMaxInactiveInterval()方法读取和设置在没有访问的情况下,会话保存的最长时间。秒为单位。负数表示会话从不超时。超时由服务器来维护。