Cookie和Session

目录

一、Cookie是什么?

二、Session是什么?

2.1 Session使用流程

三、Cookie 与 Session 的区别

四、核心方法

4.1 HttpServlet中关于Session的方法

4.2 HttpSession类中的方法

4.3 Cookie类中的方法


一、Cookie是什么?

Cookie是浏览器在本地存储数据的一种机制

  • Cookie是从服务器来的,服务器在响应中会带有Set-Cookie字段,通过这个字段就可以通过服务器将需要保存在本地的数据返回
  • 后续浏览器访问服务器的时候,就会把当前本地所有的Cookie都通过http请求带过去
  • 利用Cookie保存当前用户的登录状态

在Cookie中保存用户的身份标识,此时的身份标识如何分配,以及身份信息具体如何储存,这个就是Session机制所做的工作

二、Session是什么?

服务器在同一时刻收到的请求是很多的,服务器需要清楚的区分每个请求都属于哪个用户,就需要在服务器中记录每个用户令牌以及用户信息的对应关系。

会话的本质就是一个“哈希表”, 存储了一些键值对结构。key 就是令牌的 ID(token/sessionId),value 就是用户信息(用户信息可以根据需求灵活设计)

sessionId 是由服务器生成的一个 “唯一性字符串”, 从 session 机制的角度来看,这个唯一性字符串称为 "sessionId"。但是站在整个登录流程中看待,也可以把这个唯一性字符串称为 "token"。sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法)

Cookie和Session_第1张图片

2.1 Session使用流程

  1. 当用户登陆的时候,服务器在 Session 中新增一个新记录,并把 sessionId / token 返回给客户端。(例如通过 HTTP 响应中的 Set-Cookie 字段返回)。
  2. 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId/ token。(例如通过 HTTP 请求中的 Cookie 字段带上)。
  3. 服务器收到请求之后,根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息,再进行后续操作。

    Servlet 的 Session 默认是保存在内存中的。如果重启服务器则 Session 数据就会丢失

三、Cookie 与 Session 的区别

  • Cookie 是客户端的机制,Session 是服务器端的机制。
  • Cookie 和 Session 经常会在一起配合使用,但是不是必须配合
  • 完全可以用 Cookie 来保存一些数据在客户端。这些数据不一定是用户身份信息,也不一定是 token / sessionId
  • Session 中的 token / sessionId 也不一定通过 Cookie / Set-Cookie 传递。

四、核心方法

4.1 HttpServlet中关于Session的方法

HttpServletRequest 类中的相关方法

方法 描述
HttpSession
getSession()
在服务器中获取会话。参数如果为 true,当不存在会话时新建会话;参数如果
为 false,当不存在会话时返回 null
Cookie[]
getCookies()
返回一个数组就,包含客户端发送该请求的所有的 Cookie 对象。会自动把
Cookie 中的格式解析成键值对
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Servlet
        // 在servlet中利用 HttpServletRequest获取到Session对象
        // 如果参数是true,当没有Session对象的时候就会主动创建,false则不会创建
        HttpSession session = req.getSession(true);
        // 利用创建好的session对象将用户信息存入
        session.setAttribute("user",user);
    }

HttpServletResponse 类中的相关方法

方法 描述
void addCookie(Cookie cookie) 把指定的 cookie 添加到响应中

4.2 HttpSession类中的方法

一个 HttpSession 对象里面包含多个键值对。我们可以往 HttpSession 中存任何我们需要的信息

方法 描述
Object getAttribute(String
name)
该方法返回在该 session 会话中具有指定名称的对象,如果没
有指定名称的对象,则返回 null。
void setAttribute(String
name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew() 判定当前是否是新创建出的会话
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Servlet
        // 在servlet中利用 HttpServletRequest获取到Session对象
        // 如果参数是true,当没有Session对象的时候就会主动创建,false则不会创建
        HttpSession session = req.getSession(true);
        // 利用创建好的session对象将用户信息存入,其中user是实体类
        session.setAttribute("user",user);
        // 取出用户信息
        session.getAttribute("user");
    }

4.3 Cookie类中的方法

每个 Cookie 对象就是一个键值对

方法 描述
String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是Set-Cooke 字段设置给浏览器的)
String getValue() 该方法获取与 cookie 关联的值
void setValue(String
newValue)
该方法设置与 cookie 关联的值
  • HTTP 的 Cooke 字段中存储的实际上是多组键值对。每个键值对在 Servlet 中都对应了一个 Cookie对象。
  • 通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对
  • 通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对

你可能感兴趣的:(网络原理,Cookie,Session)