一,会话跟踪(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:请求对象初始化或者被销毁时得到通知。 |
|
来自: 121软件 > 《jsp servlet》