前言
本文转载自: www.microblog.store,且已获得授权.
一、问题背景
自己写的网站频繁出现413状态异常问题并且提示Request Entity Too Large,导致需要频繁删除本地cookie;排查了二级域名下的网站发现没有这个问题;一路查下来发现是宝塔使劲往cookie里面塞各种垃圾缓存,导致请求服务的时候后端服务器爆掉,二级域名下的cookie就干干净净的,如下图:
二级域名网站下面cookie很干净,能够顺利访问:
二、分析问题
默认情况下,HTTP请求会将同一域名下的所有cookie都发送到后台服务器
。这是HTTP协议中cookie机制的一部分。当浏览器发送HTTP请求时,它会检查请求的URL的域名,并查找与该域名相关联的所有cookie。然后,浏览器会将这些cookie添加到HTTP请求头中的Cookie字段,并随请求一起发送到服务器。
这种机制使得服务器能够识别和跟踪客户端的会话状态。服务器可以根据接收到的cookie信息来识别用户身份、维护会话数据或执行其他与客户端状态相关的操作。
所以,综上,产生请求服务频繁产生413的原因就是: 宝塔服务使劲往cookie里面堆屎+HTTP请求默认会把同域下所有的cookie都发送给后端(其实就是我没有针对性处理)。
三、解决问题
知道了产生413问题的根本原因以后,我们就可以对症下药进行处理了: 在请求拦截器里面统一拦截请求,过滤掉无用cookie数据:
export default ({store, route, redirect, $axios, req}) => {
//请求拦截器
$axios.onRequest(config => {
// 请求头添加token
const accessToken = store.state.accessToken ? store.state.accessToken : "";
const refreshToken = store.state.refreshToken ? store.state.refreshToken : "";
//添加请求头
if (accessToken !== "") {
//Authorization: Bearer token //固定格式
config.headers.Authorization = 'Bearer ' + accessToken
}
// 只向后端传递需要的cookie,解决频繁出现413问题
config.headers.Cookie = '';
config.headers.Cookie = `accessToken=${accessToken};refreshToken=${refreshToken}`;
return config
})
//....
}
成功请求: