服务器获取cookie的核心机制是读取HTTP请求头中的Cookie字段,服务器端语言通过内置对象或解析请求头来获取客户端发送的cookie数据。
服务器获取cookie的原理:HTTP请求头中的Cookie字段
每次浏览器向服务器发送请求时,只要当前域名和路径匹配已存储的cookie,浏览器会自动将这些cookie拼接到请求头(Request Headers)的Cookie字段中,格式为key=value; key2=value2,服务器端程序接收到请求后,解析该字段即可拿到完整的cookie字符串。参考2
浏览器如何决定发送哪些cookie
浏览器会根据cookie的Domain、Path、Secure、HttpOnly、SameSite等属性判断是否携带,只有域名、路径、协议都匹配的cookie才会被放入请求头,服务器端无需主动“拉取”,而是被动接收客户端主动发送的数据。
服务器端解析cookie的通用流程
- 接收到HTTP请求后,从请求头中提取
Cookie字段。 - 按分割多个cookie键值对,再按分割键值。
- 将结果存入一个字典或对象,供后续代码直接通过键名读取。
这一过程在常见后端框架中已被封装,开发者只需调用对应方法即可。
不同编程语言中服务器获取cookie的方法
每种语言都提供了获取cookie的内置接口,无需手动解析请求头,以下为主流语言和框架的实操示例。
PHP获取cookie:$_COOKIE超全局变量
PHP中,客户端发送的cookie自动存储在$_COOKIE数组中。
// 获取名为user_id的cookie值 $userId = $_COOKIE['user_id'] ?? null;
- 使用
isset($_COOKIE['key'])判断是否存在。 - 注意:
$_COOKIE仅包含当前请求中的cookie,若需设置cookie,使用setcookie()函数。
Node.js(Express)获取cookie:cookie-parser中间件
原生Node.js的req.headers.cookie返回原始字符串,但通常使用cookie-parser中间件简化:
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {
// req.cookies 包含所有cookie
console.log(req.cookies.user_id);
});
- 如果未使用中间件,需自行解析
。参考2
req.headers.cookie
- 使用
cookie-parser后,req.cookies即为对象。
Java(Spring Boot)获取cookie:@CookieValue注解
Spring Boot中,通过@CookieValue注解直接绑定到方法参数:
@GetMapping("/")
public String index(@CookieValue("user_id") String userId) {
// userId 即为cookie值
}
- 也可从
HttpServletRequest的getCookies()方法获取所有Cookie对象数组。 - 若cookie不存在,可设置
required = false避免异常。
Python(Django/Flask)获取cookie
- Django:
request.COOKIES['user_id']。 - Flask:
request.cookies.get('user_id')。
表格对比:不同语言获取cookie的代码
| 语言/框架 | 获取方式 | 示例代码 |
|---|---|---|
| PHP | $_COOKIE['key'] |
$val = $_COOKIE['key']; |
| Node.js Express | req.cookies.key(需cookie-parser) |
req.cookies.user_id |
| Java Spring Boot | @CookieValue注解或request.getCookies() |
@CookieValue("key") String val |
| Python Django | request.COOKIES['key'] |
user_id = request.COOKIES['user_id'] |
| Python Flask | request.cookies.get('key') |
request.cookies.get('user_id') |
为什么服务器获取不到cookie?常见原因排查
很多开发者遇到“服务器拿不到cookie”的问题,通常与cookie属性设置或请求环境有关,以下为最常见场景和解决方案。
域名与路径不匹配
- 服务器端设置的cookie具有
Domain和Path属性。 - 如果当前请求的域名或路径不在cookie的允许范围内,浏览器不会发送。
- 排查方法:检查浏览器开发者工具中Application/Storage面板的Cookie列表,确认cookie的Domain和Path是否包含当前页面。
HttpOnly和Secure标志的影响
HttpOnly:标记为HttpOnly的cookie无法通过JavaScript获取,但浏览器仍会自动发送给服务器,不影响服务器端读取。
Secure:仅在使用HTTPS加密连接时才会发送,如果服务器端是HTTPS但前端发送请求时协议不是HTTPS,cookie不会被携带。- 测试时建议先移除这两个标志,排除干扰。
跨域请求与SameSite限制
当请求从一个域名发送到另一个域名(跨域)时,浏览器默认不再发送cookie,除非满足以下条件:
- 请求使用
withCredentials: true(XHR)或credentials: include(Fetch)。 - 服务器响应头中设置
Access-Control-Allow-Origin为具体域名(不能是),且Access-Control-Allow-Credentials: true。 - cookie的
SameSite属性不能为Strict或Lax,若为None则必须同时设置Secure。
跨域cookie获取是前后端分离项目中的高频痛点,确认上述三个条件是否全部满足。
浏览器隐私设置与插件拦截
- 部分浏览器在无痕模式或高级隐私模式下会限制cookie发送。
- 广告拦截插件或安全软件也可能拦截第三方cookie。
- 建议在普通模式、无痕模式下分别测试,关闭插件后重试。
服务器如何设置cookie:与获取对应的反向操作
理解服务器获取cookie,也需要知道服务器如何写出cookie,因为读写逻辑往往成对出现。
使用Set-Cookie响应头
服务器通过HTTP响应头中的Set-Cookie字段来通知浏览器存储cookie,格式为:
Set-Cookie: user_id=123; Path=/; Domain=.example.com; Max-Age=3600; Secure; HttpOnly; SameSite=Lax
- 每个
Set-Cookie只能设置一个键值对,多个cookie需使用多个Set-Cookie头。 - 常用属性:
Expires/Max-Age、Path、Domain、Secure、HttpOnly、SameSite。
各语言设置cookie示例
- PHP:
setcookie('user_id', '123', time()+3600, '/'); - Node.js Express:
res.cookie('user_id', '123', { maxAge: 3600000, httpOnly: true }); - Java Spring Boot:
HttpServletResponse.addCookie(new Cookie("user_id", "123"));
设置时注意路径和域名的匹配,确保后续请求能正确携带。
服务器获取cookie在真实场景中的应用
用户身份识别与会话保持
- 用户登录后,服务器生成一个会话ID(session_id)并写入cookie。
- 后续每次请求,服务器通过读取该cookie获取session_id,继而查询用户状态。
- 这是最经典的服务器获取cookie场景,无需重复登录。
个性化推荐与追踪
- 电商网站通过cookie记录用户浏览历史,当用户再次访问时,服务器读取cookie中的分类偏好,动态调整推荐结果。
- 注意隐私合规,需在用户知情同意的前提下使用。
支付流程中的状态校验
- 在支付页面,服务器通过cookie校验订单归属,防止订单篡改。
- 通常结合签名和有效期,确保安全性。
Q&A:服务器获取cookie常见疑问
服务器获取cookie和客户端获取cookie有什么区别?
服务器获取cookie是读取HTTP请求头中的Cookie字段,由浏览器自动发送,无法直接获取未被发送的cookie,客户端(JavaScript)通过document.cookie读取当前域名下的cookie,但HttpOnly标记的cookie无法被JS获取,服务器端可以获取所有浏览器发送的cookie,包括HttpOnly的,而客户端无法读取HttpOnly的cookie。
服务器如何获取跨域请求中的cookie?
跨域请求中,浏览器默认不发送cookie,需要在客户端设置withCredentials: true(XHR)或credentials: 'include'(Fetch),同时服务器端响应头设置Access-Control-Allow-Origin为具体域名且Access-Control-Allow-Credentials: true,cookie的SameSite属性不能为Strict,若为None则必须使用HTTPS,满足这些条件后,服务器才能正常获取跨域cookie。
服务器获取到的cookie是明文还是加密的?
cookie在服务器端接收时是明文传输(若使用HTTPS则传输过程加密,但服务器读取时是解密后的明文),如果服务器端在设置cookie时进行了加密,那么获取到的值是加密后的字符串,服务器需要自行解密使用。不要将敏感信息直接明文存储于cookie中,建议存储加密后的令牌或会话ID。
服务器获取cookie的本质是解析HTTP请求头中的Cookie字段,各语言框架提供了封装好的读取方法;遇到获取不到的情况,优先检查域名、路径、跨域配置和SameSite属性,这些是绝大多数问题的根源。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/519727.html



