Session会话
servlet 容器使用HttpSession接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,
-
比如使用 cookie 或重写 URL。
-
此接口允许 servlet
-
Session就是一个接口(HttpSession)
-
Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术
-
每个客户端都有自己的一个Session会话
-
Session会话中,我们经常用来保存登录之后的信息
查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间 将对象绑定到会话,允许跨多个用户连接保留用户信息 当应用程序将对象存储到会话中或从会话中移除对象时,该会话将检查对象是否实现了 HttpSessionBindingListener。如果实现了,则 servlet 将通知该对象它已经被绑定到会话,或者已从会话中取消对它的绑定。通知是在绑定方法完成后发送的。对于无效或过期的会话,通知是在会话已经无效或过期之后发送的。
当容器使用分布式容器设置在 VM 之间迁移会话时,所有实现 HttpSessionActivationListener 接口的会话属性都会得到通知。
servlet 应该能够处理客户端选择不加入会话的情况,比如故意关闭 cookie 时。在客户端加入会话前,isNew 一直返回 true。如果客户端选择不加入会话,则 getSession 将对每个请求返回一个不同的会话,并且 isNew 将总是返回 true。
会话信息的范围仅限于当前 Web 应用程序 (ServletContext),因此存储在一个上下文中的信息在另一个上下文中不是直接可见的。
创建和获取Session(ID号、是否为新)
如何创建和获取Session,它们的API是一样的
- request.getSession()
- 第一次调用是:创建Session会话
- 之后调用都是:获取前面创建好的Session会话对象
- isNew():判断是不是新建的Session它是Boolean值
- 每个会话都有一个身份证号,也就是ID值,而且这个ID值是唯一的
- getId()得到Session的会话id值
创建Session
public class CookieServlet implements HttpSession {
protected void createOrGetSession(HttpServletRequest req,HttpServletResponse resp) throws IOException {
//创建和获取Session会话对象
HttpSession session = req.getSession();
//判断当前Session是不是新创建出来的
boolean isNew = session.isNew();
//获取Session会话的唯一标识
String id = session.getId();
resp.getWriter().write(id);
resp.getWriter().write("这个Session是否是新创建的" + isNew);
}
}
Session数据域
public class CookieServlet implements HttpSession {
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("已经往Session保存了数据");
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从Session取的数据为" + attribute);
}
}
Session默认的超时时间为30分钟在web.xml对Session的超时进行设置
方法: public void setMaxInactiveInterval(int interval)
- 值为正数时,设定Session的超时时长
- 负数表示永远不超时
<!--表示当前web工程,创建出来的所有Session默认是30分种超时时长-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
/*设置单独的Session对象的超时时间*/
protected void life(HttpServletRequest req , HttpServletResponse resp) {
//先获取Session对象
HttpSession session = req.getSession();
//设置当前Session 60秒后销毁需要客户端从新请求
session.setMaxInactiveInterval(60);
}
还有一个方法:public void invalidate() 表示让当前Session会话马上超时无效
protected void deleteNow(HttpServletRequest req , HttpServletResponse resp) {
//先获取Session对象
HttpSession session = req.getSession();
//设置当前Session马上销毁
session.invalidate();
}
以及其他的Session要实现的方法
@Override
public long getCreationTime() {
return 0;
}
@Override
public String getId() {
return null;
}
@Override
public long getLastAccessedTime() {
return 0;
}
@Override
public ServletContext getServletContext() {
return null;
}
@Override
public void setMaxInactiveInterval(int i) {
}
@Override
public int getMaxInactiveInterval() {
return 0;
}
@Override
public HttpSessionContext getSessionContext() {
return null;
}
@Override
public Object getAttribute(String s) {
return null;
}
@Override
public Object getValue(String s) {
return null;
}
@Override
public Enumeration<String> getAttributeNames() {
return null;
}
@Override
public String[] getValueNames() {
return new String[0];
}
@Override
public void setAttribute(String s, Object o) {
}
@Override
public void putValue(String s, Object o) {
}
@Override
public void removeAttribute(String s) {
}
@Override
public void removeValue(String s) {
}
@Override
public void invalidate() {
}
@Override
public boolean isNew() {
return false;
}