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属性事件对象,前者中可以获得后者的数据。