嘟嘟程序猿

SpringBoot--开发实战--Session(三十九)

2019-08-09  本文已影响18人  无剑_君

一、 Session简介

  session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。当程序需要为客户端的请求创建会话时,服务器首先检查客户端的请求是否包含会话标识符(称为会话ID)。如果包含它,它先前已为此客户端创建了一个会话。服务器根据会话ID检索会话(无法检索,将创建新会话),如果客户端请求不包含会话ID,则为客户端创建会话并生成与会话关联的会话ID。 session id应该是一个既不重复也不容易被复制的字符串。会话ID将返回给客户端以保存此响应。
  保存此会话ID的方法可以是cookie,以便浏览器可以根据交互期间的规则自动将此标志用于服务器。通常,此cookie的名称与SEEESIONID类似。但是,cookie可以被人为禁止,因此必须有其他机制在禁用cookie时将会话ID传递回服务器。经常使用的一种技术称为URL重写,它只是将会话ID直接附加到URL路径。还有一种称为形式隐藏字段的技术。也就是说,服务器将自动修改表单并添加隐藏字段,以便在提交表单时将会话ID传递回服务器。

二、Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

三、Session使用

  1. 启动类
@SpringBootApplication
// 扫描servlet注解,通过 @WebServlet、@WebFilter、@WebListener 注解自动注册
@ServletComponentScan(basePackages = "com.xtsz.*")
public class SpringSessionApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringSessionApplication.class, args);
    }
}
  1. 控制器
@Controller
@RequestMapping(value = "/")
public class IndexController {
    @ResponseBody
    @GetMapping(value = "/session")
    public Map<String, Object> getSession(HttpServletRequest request) {
        // 添加数据到Session
        request.getSession().setAttribute("username", "admin");
        // 添加sessionID到Map
        Map<String, Object> map = new HashMap<>();
        map.put("sessionId", request.getSession().getId());
        return map;
    }

    @ResponseBody
    @GetMapping(value = "/get")
    public String get(HttpServletRequest request) {
        // 获取Session数据
        String userName = (String) request.getSession().getAttribute("username");
        return userName;
    }

    @ResponseBody
    @GetMapping(value = "/logout")
    public String logout(HttpServletRequest request) {
        // 销毁sessioin
        request.getSession().invalidate();
        return "ok";
    }
}
  1. 监听器
    必须添加注解:@WebListener,SpringBoot启动时将会通过加入的注解@ServletComponentScan对该类进行扫描注入。
@WebListener
@Slf4j
public class SessionListener implements HttpSessionListener {
    private int onlineCount = 0;//记录session的数量
    /**
     * session创建后执行
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        onlineCount++;
        log.info("【HttpSessionListener监听器】 sessionCreated, onlineCount:" + onlineCount);
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }

    /**
     * session失效后执行
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if (onlineCount > 0) {
            onlineCount--;
        }
        log.info("【HttpSessionListener监听器】 sessionDestroyed, onlineCount:" + onlineCount);
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }
}
  1. 测试


    创建Session
    创建Session
销毁Session
销毁Session

四、常用配置

# 设置cookie描述
server.session.cookie.comment=
# 设置cookie作用域
server.session.cookie.domain=
# 设置cookie是否只读
server.session.cookie.http-only=
# 设置cookie最大有效时间
server.session.cookie.max-age=
# 设置cookie名称
server.session.cookie.name=
# 设置cookie生效路径
server.session.cookie.path=
# 如果使用SSL,设置为true
server.session.cookie.secure=
# 是否在重启时持久化session
server.session.persistent=
# 存储路径
server.session.store-dir=
# session过期时间
server.session.timeout=
# 设置session跟踪模式(可以设置为"cookie", "url", "ssl")
server.session.tracking-modes=
上一篇 下一篇

猜你喜欢

热点阅读