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");

        }
    }
}
原文地址:https://www.cnblogs.com/ringbug/p/15587246.html