目录

一,cookie和session的简介

1. Cookie

特点

示例代码

2. Session

特点

示例代码

3. Cookie 和 Session 的比较

二,session的工作原理

1. 客户端发起请求

2. 服务器创建 Session

3. 服务器发送 Session ID 给客户端

4. 客户端保存 Session ID

5. 服务器验证 Session ID

6. 服务器更新 Session 数据

7. Session 过期处理

示例代码


一,cookie和session的简介

Cookie 和 Session 是在 Web 开发里用于管理用户会话的重要机制,以下是对它们的详细介绍:

1. Cookie

Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。它会在客户端和服务器之间随 HTTP 请求和响应来回传递,可用于存储用户的一些信息。

特点
  • 客户端存储Cookie 数据存于客户端浏览器,所以可以在浏览器下次向同一服务器发送请求时携带这些数据。
  • 有大小限制:一般来说,每个 Cookie 的大小限制在 4KB 左右。
  • 可设置过期时间:能设置 Cookie 的过期时间,过期后 Cookie 会自动被浏览器删除。
  • 安全性较低:因为 Cookie 存储在客户端,容易被篡改或窃取,所以不适合存储敏感信息。
示例代码

以下是使用 Python 的 Flask 框架设置和获取 Cookie 的示例:

python

from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/set_cookie')
def set_cookie():
    resp = make_response('Setting cookie!')
    resp.set_cookie('username', 'JohnDoe')
    return resp

@app.route('/get_cookie')
def get_cookie():
    username = request.cookies.get('username')
    return f'Username from cookie: {username}'

if __name__ == '__main__':
    app.run(debug=True)

2. Session

Session 是一种服务器端的会话机制,用于跟踪用户的会话状态。服务器会为每个用户创建一个唯一的 Session ID,并将其发送给客户端,客户端通过 Cookie 或 URL 参数来保存这个 Session ID

特点
  • 服务器端存储Session 数据存于服务器端,相对安全。
  • 无大小限制:服务器端存储数据不受 Cookie 大小的限制。
  • 依赖 Session ID:客户端通过 Session ID 来访问服务器端的 Session 数据。
  • 可设置过期时间:同样可以设置 Session 的过期时间,过期后 Session 数据会被服务器删除。
示例代码

以下是使用 Python 的 Flask 框架设置和获取 Session 的示例:

python

from flask import Flask, session, redirect, url_for

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/set_session')
def set_session():
    session['username'] = 'JohnDoe'
    return 'Session set!'

@app.route('/get_session')
def get_session():
    username = session.get('username')
    if username:
        return f'Username from session: {username}'
    else:
        return 'Session not set!'

@app.route('/delete_session')
def delete_session():
    session.pop('username', None)
    return 'Session deleted!'

if __name__ == '__main__':
    app.run(debug=True)

3. Cookie 和 Session 的比较

  • 安全性Session 存于服务器端,安全性更高;而 Cookie 存于客户端,容易被篡改或窃取。
  • 数据存储位置Cookie 存于客户端,Session 存于服务器端。
  • 数据大小限制Cookie 有大小限制,而 Session 没有。
  • 性能Session 需要服务器端的额外开销,性能相对较低;Cookie 由于是客户端存储,性能较高。

在实际开发中,通常会结合使用 Cookie 和 Session,用 Cookie 来存储 Session ID,用 Session 来存储用户的敏感信息和会话状态。

二,session的工作原理

Session 作为服务器端的会话管理机制,其工作原理主要涉及以下几个关键步骤:

1. 客户端发起请求

当用户首次访问网站时,浏览器会向服务器发送一个 HTTP 请求。这个请求可能是访问首页、登录页面或者其他资源。在这个阶段,客户端并没有携带 Session ID,因为还没有建立 Session

2. 服务器创建 Session

  • 服务器接收到客户端的请求后,会检查请求中是否包含 Session ID。由于是首次请求,此时请求中没有 Session ID
  • 服务器会为该客户端创建一个新的 Session 对象,这个对象会在服务器端存储与该用户会话相关的数据,例如用户的登录状态、购物车信息等。
  • 服务器会为这个 Session 分配一个唯一的 Session ID,这个 Session ID 通常是一个长字符串,用于标识该 Session

3. 服务器发送 Session ID 给客户端

  • 服务器会在响应头中添加一个 Set-Cookie 字段,将 Session ID 作为 Cookie 发送给客户端。例如:

plaintext

Set-Cookie: session_id=abcdef123456; Path=/; HttpOnly

  • 这里的 session_id 就是服务器为客户端分配的 Session IDPath=/ 表示该 Cookie 适用于整个网站,HttpOnly 表示该 Cookie 只能通过 HTTP 请求访问,不能通过 JavaScript 脚本访问,这样可以提高安全性,防止 Session ID 被窃取。

4. 客户端保存 Session ID

  • 浏览器接收到服务器的响应后,会将 Session ID 作为 Cookie 保存在本地。之后,在后续的每个 HTTP 请求中,浏览器都会自动在请求头中添加这个 Cookie,将 Session ID 发送给服务器。例如:

plaintext

Cookie: session_id=abcdef123456

5. 服务器验证 Session ID

  • 服务器接收到客户端的请求后,会从请求头中提取 Session ID
  • 服务器会根据这个 Session ID 在服务器端查找对应的 Session 对象。如果找到对应的 Session 对象,说明该客户端已经建立了 Session,服务器可以根据 Session 中存储的数据来处理请求。

6. 服务器更新 Session 数据

  • 在处理客户端请求的过程中,服务器可能会更新 Session 中的数据。例如,用户登录成功后,服务器会将用户的登录状态存储在 Session 中。
  • 服务器会将更新后的 Session 数据保存到服务器端。

7. Session 过期处理

  • 为了节省服务器资源,Session 通常会设置一个过期时间。如果在一定时间内客户端没有向服务器发送请求,Session 会自动过期。
  • 当 Session 过期后,服务器会删除该 Session 对象及其相关数据。客户端再次发送请求时,服务器会将其视为新的会话,重新创建 Session

示例代码

以下是一个使用 Python 的 Flask 框架的示例,展示了 Session 的工作原理:

python

from flask import Flask, session, request

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/')
def index():
    # 检查 Session 中是否有用户信息
    if 'user' in session:
        return f'Welcome back, {session["user"]}!'
    else:
        return 'You are not logged in.'

@app.route('/login')
def login():
    # 模拟用户登录
    session['user'] = 'JohnDoe'
    return 'You have logged in.'

@app.route('/logout')
def logout():
    # 模拟用户退出登录
    session.pop('user', None)
    return 'You have logged out.'

if __name__ == '__main__':
    app.run(debug=True)

在这个示例中,当用户访问 /login 路径时,服务器会将用户信息存储在 Session 中;当用户访问 /logout 路径时,服务器会从 Session 中删除用户信息;当用户访问首页时,服务器会检查 Session 中是否有用户信息,并根据检查结果返回相应的信息。

更多推荐