`

转:会话跟踪技术:会话Cookie,URL重写和HttpSession

    博客分类:
  • java
 
阅读更多

一,会话跟踪(session tracking)技术
 会话是客户端发送请求,服务器返回响应的连接时间段。
 HTTP是无状态协议:每次都是单独连接,不能维持客户的上下文信息。
 会话跟踪技术是用于维持客户端和服务器端通信信息的技术。
 
 三种典型客户端会话跟踪解决方案:
  1,Cookie;
  2,URL重写;
  3,隐藏表单域;

二,会话Cookie
 用于会话跟踪的Cookie叫做会话Cookie。Servlet规范中会话跟踪的cookie名字必须是JSESSIONID,保存在浏览器的内存中。区别于保存在外部存储设备的cookie。 
 对于存储在内存中的cookie,是不能被不同的浏览器进程共享,共享只能发生在同一个浏览器进程的不同窗口(对个窗口共享一个进程)中。对于存储在外部设备的cookie,可以多浏览器共享。


三,url重写
 在浏览器不支持或禁用cookie的情况下,使用url重写代替cookie来跟踪用户会话。
 每个页面都必须使用servlet或jsp动态生成(动态页面)。因为附加在URL上的sessionID是动态产生,所以对于静态页面的跳转,URL重写机制无能为力。
 即使使用动态页面,如果用户离开了会话并且通过书签或链接再次回来,会话信息也会丢失,因为存储下来的链接含有错误的标识信息。
 
 必 须将所有发送到客户端的url进行编码,调用HttpServletResponse接口中的encodeURL()方法和 encodeRedirectURL()方法来实现。在调用sendRedirect()方法之前使用encodeRedirectURL()方法.
 
四,隐藏表单域
 只能用于特定操作中。仅当每个页面都由表单提交而动态生成的时候,才可以使用隐藏表单域,用来存储相关会话信息。

五,servlet中的会话跟踪
 javax.servlet.http.HttpSession接口是servlet提供会话跟踪解决方案。
 HttpSession对象存放在服务器端,只是对cookie和url重写技术的封装应用,所以要求服务器支持cookie,可以全局切换到url重写。

 1,访问与当前请求相关联的会话对象:getSession(boolean value)方法

  在会话过程中,web容器负责为客户端维护一个唯一的HttpSession对象。
  对于新会话,web容器创建使用实现了HttpSession接口的HttpSession对象封装当前请求会话的信息(散列表的方式存储)。
  
  使用HttpServletRequest的getSession()方法访问HttpSession对象。
   在后台,系统从cookie或URL重写附加的数据中提取出用户ID。以ID为key,遍历之前创建的HttpSession对象内建的散列表。
   如果找不到匹配的会话ID,系统重新创建一个新的会话。默认情况下(不禁用Cookie)还会创建一个名为JSESSIONID,值为唯一标识用户表示会话ID的输出cookie。  
  因为调用getSession()方法会影响到后面的响应,所以只能在发送任何文档内容到客户端之前调用getSession()方法。

  区别:getSession(boolean value)方法:如果系统没有找到与请求关联的会话ID,true表示返回新会话。false表示方法返回null。

 2,访问和设置与会话相关联信息,维护会话的状态:HttpSession的getAttribute()方法和setAttribute()方法

  散列表:HttpSession对象内建数据结构,用于存储 当前请求会话的数据(会话的属性)。可以存储任意数量的key-value对。
  使用HttpSession的getAttribute()方法和setAttribute(String key,Object value)方法读取和设置当前请求会话数据(即对散列表的操作),维护会话的状态。
  setAttribute方法会替换任何之前的属性。如果不想被替换,则需要在设置之前使用removeArrtibute(String key)方法移除该属性。
  
  setAttribute方法会触发所有实现了HttpSessionBindingListener接口的valueBound方法,做一些初始化状态的操作。
  removeArrtibute方法会触发所有实现了HttpSessionBindingListener接口的valueUnbound方法,做一些消除状态的操作。

  对于分布式WEB应用程序,将web应用程序标记为可分布式执行,系统需要能够将会话对象在机器之间传递,这时需要将会话的属性实现Serializable接口。

 3,废弃会话数据
  只移除自己编写的的servlet创建的数据:removeArrtibute(String key)方法
  (web应用程序中删除)删除整个会话:invalidate()方法,可以用该方法注销用户。
  (Web服务器中删除)将用户从系统中注销并且删除所有与该会话关联的会话:logout()方法。一定要与其他web应用程序协调loggout命令的使用。
  
 4,会话超时时间间隔
  getMaxInactiveInterval()方法和setMaxInactiveInterval()方法读取和设置在没有访问的情况下,会话保存的最长时间。秒为单位。负数表示会话从不超时。超时由服务器来维护。

 5,会话最后次被客户端访问的时间:getLastAccessedTime()方法
  可以用来确定客户端在二次请求之间会话的非活动时间。

 6,获取会话被创建的时间:getCreationTime()方法 返回long类型数据

 7,返回分配给session的唯一标识ID,为字符串。getId()方法

六,浏览器会话与服务器会话
 浏览器会话
  默认情况下,会话跟踪基于存储在浏览器内存中的cookie,区别于存储在外围存储设备上的cookie。
  需要servlet显示的读取JSESSION cookie,设置最大时效和路径并添加到客户端,否则退出浏览器就会中断会话。
 服务器会话
  服务器需要将会话保存在内存中,在会话处于非活动状态超过设定的间隔(会话超时)就移除会话。

七,对绑定到session中的对象(属性)初始化和消除状态。HttpSessionBindingListener监听器接口和HttpSessionBindingEvent事件类。

 Servlet容器通过实现HttpSessionBindingListener监听器接口的监听器来监听HttpSessionBindingEvent事件。
 
 HttpSessionBindingListener监听器接口方法:
 1,valueBound(HttpSessionBindingEvent event):对象被绑定到session中时该方法通知对象。做初始化操作。
 2,valueUnbound(HttpSessionBindingEvent event): 对象被移除出session时该方法通知对象。做消除状态操作。
 
 HttpSessionBindingEvent事件方法:
 1,getName():获取触发事件的属性的名字。
 2,getValue():获取触发事件的属性的值。
 3,getSession():返回Session对象。


八,在 Java Servlet API中有关的监听器接口。

 与Session相关的监听器接口
 javax.servlet.http.HttpSessionActivationListener:如果绑定到Session中,当Session被钝化或激活时,Servlet容器将通知该对象。
 javax.servlet.http.HttpSessionAttributeListener:如果想要在Session中的属性列表发生改变时得到通知,可以实现这个接口。
 javax.servlet.http.HttpSessionListener:如果需要在Session创建后或者Session无效前得到通知,可以实现这个接口,实现该接口的类必须在web应用程序的部署描述符中进行配置。
 
 与Servlet上下文有关的监听器接口:
 javax.servlet.ServletContextAttributeListener:在Servlet上下文中的属性列表发生改变时得到通知,可以实现这个接口,实现该接口的类必须在web应用程序的部署描述符中进行配置。
 javax.servlet.ServletContextListener:如果需要在Servlet上下文对象初始化时或被销毁的时候得到通知,可以实现这个接口,实现该接口的类必须在web应用程序的部署描述符中进行配置。

 与请求相关的监听器接口:servlet2.4规范定义
 javax.servlet.ServletRequestAttributeListener:Servlet请求对象中的属性发生改变时得到通知。
 javax.servlet.ServletRequestListener:请求对象初始化或者被销毁时得到通知。

 

http://blog.csdn.net/qfs_v/article/details/2652119

分享到:
评论

相关推荐

    java_web_第4章_会话跟踪.ppt

    会话跟踪 4.1 会话管理 4.2 通过Cookie支持会话 4.3 URL重写与隐藏表单域 4.1.1 理解状态与会话 4.1.2 会话管理机制 4.1.3 HttpSession接口 4.1.4 使用HttpSession对象 4.1.5 会话超时与结束

    jsp基础精华详解

    四种会话跟踪方式: 1.Session HttpSession session = request.getSession(); session.setAttribute("name", "zhangsan"); session.setAttribute("pwd", "aaa"); String name = (String) session.getAttribute("name...

    java web技术开发大全(最全最新)

    4.6.5 实例:通过重写uRL跟踪Session 4.7 Web开发的中文问题 4.7.1 Java的编码原理 4.7.2 实例:解决输出中文乱码问题 4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX技术...

    JSP100选择题 JSP100选择题 适合考前练习

    JSP100选择题 适合考前练习 1 J2EE 中,()类的()方法用于创建对话。(选择一项) ...在禁用Cookie时可以使用URL重写技术跟踪会话 D.隐藏表单域将字段添加到HTML表单并在客户端浏览器中显示 …………

    java web开发技术大全

    4.6.5 实例:通过重写uRL跟踪Session 4.7 Web开发的中文问题 4.7.1 Java的编码原理 4.7.2 实例:解决输出中文乱码问题 4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX...

    java-servlet-api.doc

    随着时间的过去,发展了许多会话跟踪的技术,但是使用起来都比较麻烦。 JavaServletAPI提供了一个简单的接口,通过这个接口,Servlet引擎可以有效地跟踪用户的会话。 建立Session 因为HTTP是一个请求-响应协议,一...

    自己实现的spring-session

    自己实现httpSession,在getSession中获取cookie,从cookie中读取sessionId, 如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建...

    J2EE中文API文档

    J2EE中文API文档 public interface HttpSession 版本: 创建时间2007-11-7 下午05:55:23 类说明 这个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的关联。... 一个 session可以通过cookie或重写URL来维持。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话跟踪 306 9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话跟踪 306 9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话跟踪 306 9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话跟踪 306 9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 ...

    java 面试题 总结

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect...

    超级有影响力霸气的Java面试题大全文档

     forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。...

Global site tag (gtag.js) - Google Analytics