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

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或获得一个新建的session
HttpSession getSession()
//如果create=true,和getSession()同样效果,否则,当session不存在时将返回null
HttpSession getSession(boolean create)

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> 

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

需要注意的是:
超时 并不是指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) {
    }
}

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

<listener>
    <listener-class>***.SessionListener</listener-class>
</listener>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值