HttpSession API
1. 接口介绍
官方地址:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html
提供一种方法,用于跨多个页面请求或访问网站来识别用户,并存储有关该用户的信息。
servlet容器使用此接口在HTTP客户端和HTTP服务器之间创建会话。会话将在指定的时间段内持续,跨越多个连接或用户的页面请求。一个会话通常对应于一个用户,该用户可以多次访问一个站点。服务器可以通过多种方式维护会话,例如使用cookie或重写URL。
此接口允许servlet查看和操作有关会话的信息,例如会话标识符、创建时间和上次访问时间将对象绑定到会话,允许用户信息跨多个用户连接持久化
当应用程序在会话中存储对象或从会话中删除对象时,会话将检查该对象是否实现HttpSessionBindingListener。如果是,servlet将通知对象它已绑定到会话或已从会话中解除绑定。通知在绑定方法完成后发送。对于无效或过期的会话,将在会话无效或过期后发送通知。
当容器在分布式容器设置中的VM之间迁移会话时,将通知实现HttpSessionActivationListener接口的所有会话属性。
servlet应该能够处理客户端不选择加入会话的情况,例如故意关闭cookie的情况。在客户端加入会话之前,isNew将返回true。如果客户端选择不加入会话,getSession将在每个请求上返回不同的会话,isNew将始终返回true。
会话信息的范围仅限于当前web应用程序(ServletContext),因此存储在一个上下文中的信息在另一个上下文中不会直接可见。
2. 方法摘要:
返回值 | 方法名 (参数) |
---|---|
java.lang.Object | getAttribute(java.lang.String name) 返回在此会话中使用指定名称绑定的对象,如果名称下没有对象绑定,则返回null。 |
java.util.Enumeration | getAttributeNames() 返回字符串对象的枚举,其中包含绑定到此会话的所有对象的名称。 |
long | getCreationTime() 返回创建此会话的时间,从1970年1月1日格林威治标准时间午夜起以毫秒为单位。 |
java.lang.String | getId() 返回包含分配给此会话的唯一标识符的字符串。 |
long | getLastAccessedTime() 返回客户端上次发送与此会话关联的请求的时间,以自1970年1月1日格林威治标准时间午夜以来的毫秒数表示,并以容器接收请求的时间标记。 |
int | getMaxInactiveInterval() 返回servlet容器在客户端访问之间保持此会话打开的最大时间间隔(秒)。 |
ServletContext | getServletContext() 返回此会话所属的ServletContext。 |
HttpSessionContext | getSessionContext() 已弃用。从版本2.1开始,此方法已弃用,并且没有替换。它将在未来版本的JavaServletAPI中删除。 |
java.lang.Object | getValue(java.lang.String name) 已弃用。从版本2.2开始,此方法被替换为getAttribute(java.lang.String)。 |
java.lang.String[] | getValueNames() 已弃用。从版本2.2开始,此方法被替换为getAttributeNames() |
void | invalidate() 使该会话无效,然后解除绑定到该会话的所有对象。(意味着删除所有回话) |
boolean | isNew() 如果客户端尚不知道该会话,或者如果客户端选择不加入该会话,则返回true。 |
void | putValue(java.lang.String name, java.lang.Object value) 已弃用。从版本2.2开始,此方法将被setAttribute(java.lang.String、java.lang.Object)替换 |
void | removeAttribute(java.lang.String name) 从此会话中删除与指定名称绑定的对象。 |
void | removeValue(java.lang.String name) 已弃用。从2.2版开始,此方法替换为removeAttribute(java.lang.String) |
void | setAttribute(java.lang.String name, java.lang.Object value) 使用指定的名称将对象绑定到此会话。 |
void | setMaxInactiveInterval(int interval) 指定servlet容器使此会话无效之前客户端请求之间的时间(秒),设置失效时间。 |
3.代码示例
点击查看代码
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Enumeration;
import java.util.Objects;
import java.util.UUID;
public class SessionUtil {
/**
* session key
*/
private final String USER_SESSION_KEY = "user_session_key";
private HttpSession initSession() {
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
return request.getSession();
}
/**
* 当前是否登录
*
* @return
*/
public boolean isLogin() {
return null != getUser();
}
/**
* 获取session中的用户信息
*
* @return User
*/
public Object getUser() {
return initSession().getAttribute(USER_SESSION_KEY);
}
/**
* 添加session
*
* @param user
*/
public void setUser(Object user) {
initSession().setAttribute(USER_SESSION_KEY, user);
}
/**
* 删除session信息
*/
public void removeUser() {
initSession().removeAttribute(USER_SESSION_KEY);
}
/**
* 获取session中的Token信息
*
* @return String
*/
public String getToken(String key) {
return (String) initSession().getAttribute(key);
}
/**
* 添加Token
*/
public void setToken(String key) {
initSession().setAttribute(key, UUID.randomUUID().toString());
}
/**
* 删除Token信息
*/
public void removeToken(String key) {
initSession().removeAttribute(key);
}
/**
* 删除所有的session信息
*/
public void removeAllSession() {
Enumeration<String> attrs = initSession().getAttributeNames();
while(attrs.hasMoreElements()){
// 获取session键值
String name = attrs.nextElement().toString();
// 根据键值取session中的值
Object vakue = initSession().getAttribute(name);
// 打印结果
System.out.println("------" + name + ":" + vakue +"--------\n");
}
}
}