Servlet 会话

在网络的七层模型中,会话层位于传输层之上,它定义如何开始、控制和结束一个会话。七层模式目前仅仅处于理论阶段,但是Web中借鉴了其中的一些思路。在Web中浏览器第一次发送请求到服务器开始直到一方断开为止算作一个会话。HTTP协议本身没有状态,那么Web服务如何知道这次请求是否在一个会话中呢?Web提供了Cookie和Session两种技术。

服务器在第一次收到请求之后,会在HTTP响应头的Set-Cookie中,设置Cookie值,浏览器收到响应后,保存这个Cookie在本地。后续再进行请求的时候在HTTP的请求头中设置Cookie值,服务器根据此Cookie来识别请求的状态。

Cookie值本身是一个键值对,例如 Cookie: name=value;

Servlet 使用Cookie

在Servlet中,使用Cookie的步骤如下:

  1. 创建Cookie对象 new Cookie(String name, String value)
  2. 发送cookie到浏览器 response.addCookie(Cookie)
  3. 获取浏览器中发送过来的cookie request.getCookies() 返回所有Cookie
  4. 遍历Cookies 获取所有cookie对象
  5. 调用Cookie.getName(), Cookie.getValue()获取Cookie中的键和值

使用的注意事项如下:

  1. 一次可以返回多个Cookie,多次调用response.addCookie即可
  2. 默认情况下浏览器关闭页面后cookie失效,但是可以设置cookie失效时间

Cookie虽然可以用来识别一次会话,但是也不能滥用,第一Cookie是存储在浏览器端的,可以被伪造,一般做过爬虫自动登录的都这样干过,第二浏览器对于单个cookie大小有限制,一般是4kb。同时浏览器对于单个域名的cookie也有限制,默认是20个。由于cookie本身是类似于小饼干的小料,一般来说不会把小料作为主菜。

Session

Cookie一般作为小料,作为会话标识来说,用Session更为常见。

与 Cookie相比Session存储在服务器端,Session没有cookie的那些限制。

实现原理

Session的实现是基于Cookie的。

  1. 第一次调用request.getSession获取Session,没有Cookie 会在内存中创建一个新的Cookie对象,名称为JSESSION值是一个唯一的ID,作为session的唯一标识
  2. 在给客户端响应时会包含一个cookie值,Set-Cookie: JSESSION=ID
  3. 浏览器在下一次访问web中的其他资源时会将cookie作为请求头发送到服务器。
  4. 服务器会从cookie中取出ID值,并根据ID从内存中查找对应的Session对象

使用 HttpSession session = request.getSession(); 来获取一个Session对象

函数列表

Session 对象常用函数如下:

public Object getAttribute(String name); //该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
public Enumeration getAttributeNames(); //该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
public long getCreationTime(); //该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public String getId(); //该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
public long getLastAccessedTime(); //该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public int getMaxInactiveInterval(); //该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
public void invalidate(); //该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
public boolean isNew(); //如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
public void removeAttribute(String name); //该方法将从该 session 会话移除指定名称的对象。
public void setAttribute(String name, Object value); //该方法使用指定的名称绑定一个对象到该 session 会话。
public void setMaxInactiveInterval(int interval); //该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java设计模式(2)-单例设计模式

    上一篇推文写了工厂方法模式,包括简单工厂模式、多工厂模式、静态工厂模式、抽象工厂模式,这篇推文记录一下单例设计模式

    爱敲代码的猫
  • java设计模式(6)-代理模式(必看的springAOP原理)

    代理模式 最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又可以分为jdk代理和Cglib代理

    爱敲代码的猫
  • java设计模式(4)-原型设计模式

    这篇推文学习创建型模式最后一种-原型模式,该模式的思想是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象,以便使用

    爱敲代码的猫
  • JVM 最多支持多少个线程?

    这取决于你使用的CPU,操作系统,其他进程正在做的事情,你使用的Java的版本,还有其他的因素。我曾经见过一台Windows服务器在宕机之前有超过6500个线程...

    一个优秀的废人
  • 7 个 IntelliJ IDEA 必备插件,显著提升编码效率

    2.选择plugins--》install pluginfrom disk 选择相应插件包==》点击ok

    芋道源码
  • SpringBoot 实战 | 使用 LomBok

    LomBok 是一个插件,它能通过注解帮我们消除那些必须要写但是重复的代码,比如setter,getter,构造函数之类的方法。

    一个优秀的废人
  • 我最推荐的一张Java后端学习路线图,Java工程师必备

    学习路线图往往是学习一样技术的入门指南。网上搜到的Java学习路线图也是一抓一大把。

    Java技术江湖
  • SpringBoot 实战 | 集成 Swagger2 构建强大的 RESTful API 文档

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

    一个优秀的废人
  • 利用 python+plotly 制作Contour Plots模拟双波源干涉现象

    本人在学习使用 plotly 的contour plots 制作的时候,发现利用这个表格制作波的干涉模拟方面有很不错的效果,因为之前被各种波动方程和振动方程教育...

    八音弦
  • Java秋招面经大合集(含BAT等大厂面经,均已拿offer)

    我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。

    Java技术江湖

扫码关注云+社区

领取腾讯云代金券