Web开发之Session

本文探讨了Web开发中的Session技术,包括Session的获取、实现原理、超时时间、生命周期,以及Session与Cookie的区别,强调了Session在安全性、服务器负担和跨域特性方面的特点。

1. 前言

SessionCookie 的作用有点类似,都是为了存储用户相关的状态信息,是一种会话跟踪技术

  • Cookie 是存储在本地浏览器,而 Session 存储在服务器
  • 存储在服务器的数据会更加的安全,不容易被窃取,并且 SessionCookie 使用方便,Session 可以存储对象,Cookie 只能存储字符串,并且 Tomcat 8.x 之后的版本中 Cookie 可以存储的字符类型有限制

2. Session 的获取

2.1. request.getSesssion()

  • 调用该方法,如果是第一次请求的时候,服务器会创建一个 Session 对象返回
  • 如果当前会话已经有了 Session 对象那么 getSesssion() 方法直接返回当前的 Session 对象

2.2. request.getSession(boolean)

  • 当参数为 true 时,与 requeset.getSession() 相同
  • 参数为 false,那么如果当前会话中存在 Session 对象则返回,不存在返回 null,而不是创建

3. Session 的实现原理

Session 的实现是依赖 Cookie

在这里插入图片描述

  • 用户第一次请求服务器的时候,浏览器将用户信息发送给服务器,服务器根据用户提交的信息,创建对应的 Session
  • 请求返回时,将此 Session 的唯一标识信息 SessionId 返回给浏览器,浏览器接收到 SessionId 信息后,会将此信息存入到 Cookie 中,同时 Cookie 会记录此 SessionId 属于哪个域名
  • 用户第二次请求服务器时,该请求会携带 Cookie 中的 SessionId 信息,服务器会从 Cookie 中取出 SessionId,再根据 SessionId 查询对应的 Session 信息。如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作

4. Session 的超时时间

  • Session 生成后,只要用户继续访问,服务器就会更新 Session 的最后访问时间,并维护该 Session
  • 为了防止内存溢出,服务器会把超过 30 分钟依然没有活跃的 Session 从内存中删除。如果你打开网站的一个页面开始长时间不动,超出了 30 分钟后,再去点击链接或提交表单时你会发现你的身份已经过期,因为你的 Session 已经丢失了
  • 对于单个 Session 对象,可以通过在代码中 调用 setMaxInactiveInterval() 方法设置超时时间,默认是 30 分钟,单位是秒;值为 0 或负数表示 Session 永不超时

5. Session 其他常用 API

在这里插入图片描述

6. SessionId 的生命周期

Session 保存在服务器中,而 SessionId 通过 Cookie 发送给客户端,但我们知道 Cookie 的默认生命是 -1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个 Cookie 就有可能丢失了。当客户下一次打开浏览器访问的时候,虽然可能此时服务器端的 Session 还没有过期,但是由于没有了 SessionId,那么此前的 Session 就找不到了,因此客户的状态可能就丢失了,可能就又需要重新登录

对此,我们可以手动设置 JSESSIONIDCookie 的过期时间

@WebServlet("/session-servlet")
public class SessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        HttpSession session = req.getSession();
        Cookie jsessionid = new Cookie("JSESSIONID", session.getId());
        jsessionid.setMaxAge(30 * 60);
        jsessionid.setPath("/");
        resp.addCookie(jsessionid);
    }
}

7. SessionCookie 的区别

从隐私安全上比较

  • Cookie 存储在浏览器中,信息容易泄露出去
  • Session 存储在服务器上,不存在敏感信息泄露问题

从对服务器的负担比较

  • Session 是保存在服务器的,如果每个用户都会产生一个 Session,如果是并发访问的用户非常多,是不能使用 Session 的,Session 会消耗大量的内存
  • Cookie 是保存在客户端的。不占用服务器的资源

从跨域名上比较

  • Cookie 可以设置 domain 属性来实现跨域名
  • Session 只在当前的域名内有效,不可夸域名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值