Servlet 中 session 的创建、销毁及监听 原创 2016年03月23日 18:09:33 标签:session /session超时 /在线人数统计 4916 1、session 和 c

来源:互联网 发布:中兴通讯数据分析 编辑:程序博客网 时间:2024/06/05 08:17

Servlet 中 session 的创建、销毁及监听

原创 2016年03月23日 18:09:33

1、session 和 cookie

关于session和cookie详细的内在机制和区别,请另行查阅资料。 
可参看:Session机制详解

当客户端首次请求session对象时候,服务器会为其创建一个session,并计算出具有唯一性的sessionId,用来标识该session对象,并将被其包含在本次请求响应中返回给客户端,客户端一般采用cookie对其进行保存。在session有效期,当浏览器下次请求时,浏览器会自动将sessionId添加到请求头中,服务器可在接收到的请求中得到sessionId查询服务端的session,用于判断用户状态与身份等。

有时,cookie会在客户端被禁用,此时解决方法一般是采用URL重写(作为查询参数或是URL路径的附加信息)或是使用隐藏表单字段进行处理。


2、session创建

session并非在有客户端访问时就被创建,而是在 HttpServletRequest.getSession()被调用时才被创建。 
同时这也是读取session的方法。

//获得当前请求的session或获得一个新建的sessionHttpSession getSession()//如果create=true,和getSession()同样效果,否则,当session不存在时将返回nullHttpSession getSession(boolean create)
  • 1
  • 2
  • 3
  • 4
  • 5

3、session销毁

//第一种方法:调用invalidate()方法直接销毁session.invalidate();//第二种方法:调用setMaxInactiveInterval()方法设置超时,参数单位是秒session.setMaxInactiveInterval(600);//第三种方法:在web.xml中初始化servlet时添加超时参数,单位是秒<servlet>      <servlet-name>Example</servlet-name>      <servlet-class>com.*.*.Example</servlet-class>      <init-param>           <param-name>timeout</param-name>           <param-value>600</param-value>     </init-param>  </servlet>  //第四种方法:在web.xml中添加超时配置,单位是分钟<session-config>      <session-timeout>10</session-timeout>  </session-config> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

超时方法的优先级依次递减。

需要注意的是: 
超时 并不是指session的生命周期,而是客户端不与服务器进行交互后到session自动销毁的时间间隔。 
如果客户端一直有与后台进行交互,或者客户端会定时向后台发送请求以确保session不过期(新浪微博就是这样的机制),那么只有在浏览器关闭之后等待超时才会销毁session。


4、session监听

为了统计在线用户以及实际的登录次数等数据,可以监听session的创建、销毁等状态来达到目的。 
javax.servlet API为此提供了两个接口,包含的方法如下,各方法的名称已经对其功能有较好的描述:

public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener{    @Override    public void attributeAdded(HttpSessionBindingEvent event) {    }    @Override    public void attributeRemoved(HttpSessionBindingEvent event) {    }    @Override    public void attributeReplaced(HttpSessionBindingEvent event) {    }    @Override    public void sessionCreated(HttpSessionEvent se) {    }    @Override    public void sessionDestroyed(HttpSessionEvent se) {    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

最后,在web.xml中进行注册就会在session创建、销毁以及属性改变时调用相应的方法。

<listener>    <listener-class>***.SessionListener</listener-class></listener>
  • 1
  • 2
  • 3

另外,需要注意HttpSessionEvent 和 HttpSessionBindingEvent 的差别,前者是session事件对象,后者是session属性事件对象,前者中可以获得后者的数据。

阅读全文
0 0