【整理总结】前端必知必会的几个实用响应头

【整理总结】前端必知必会的几个实用响应头

阅读本文,你将:

学会几个超级超级实用的 响应头,解决你工作中遇到的问题。

不仅解决问题,还能让你在 和后端、运维撕逼时 占据上风。

学习 响应头 很重要吗?

真的很重要。

不信你看看下面的场景,眼熟不?

一、预览、下载 让人操碎了心?

1.1 场景

我不止一次听到同事、群友们讨论这个问题:

立即学习“前端免费学习笔记(深入)”;

“后端提供了一个 txt(或者 pdf/’json’ 等)文件的下载 url,可以当我用 a 标签打开时,却变成了预览……怎么办?救!!!”

此时,就会有人上去推荐 FileSaver.js 或者 “手写读流另存为”。

然后还有人附和…

我:???

1.png

这是需要写代码才能解决的问题吗?

如果你有了解过 Content-Disposition 这个 Response Header,那你一定知道,只需要响应头上增加一行,问题就能迎刃而解。

1.2 介绍

Content-Disposition:这个响应头可以决定内容是 预览 还是 下载

它支持三种格式的值:

Content-Disposition: inline
此时,消息体会以页面的一部分或者整个页面的形式展示。(预览)

Content-Disposition: attachment
消息体应该被下载,默认文件名和 url 格式有关。

Content-Disposition: attachment; filename="filename.jpg"
消息体应该被下载,默认文件名可指定。

注:如果需要预览,需要配合适当的 Content-Type 食用;

1.3 示例

为此,我特意写了一个 express 小示例。

大抵是在 express 应用下写了三个路由,如下:

const user = {  name: "摸鱼的春哥",  blogUrl: "https://juejin.cn/user/1714893870865303"}const contentDispositionInline = async (req, res, next) => {  res.setHeader('Content-Disposition', 'inline')  res.send(user)}const contentDispositionFilename = async (req, res, next) => {  res.setHeader('Content-Disposition', 'attachment; filename="chunge.json"')  res.send(user)}const contentDispositionNoFilename = async (req, res, next) => {  res.setHeader('Content-Disposition', 'attachment')  res.send(user)}

然后我分别访问三个路由,效果差异:

2.png

二、项目升级了,需要客户 清空缓存 ?

2.1 场景

实施:“客户反馈Bug 还是没修复。”
你:“哥,真修复了,要不你让客户清一下缓存?”
实施:“啊?客户说他不会清……”
……【整理总结】前端必知必会的几个实用响应头

必应图像创建器 必应图像创建器

微软必应出品的AI绘图工具

必应图像创建器 453 查看详情 必应图像创建器

永远不要期望你的客户会进行 “那些研发才懂” 的操作。也不要把你的问题,归因到 浏览器缓存 上。

浏览器缓存 是被发明出来优化用户体验的,并不是被发明出来阻碍用户的。

因此,理解如何使用 Cache-Control 这个响应头,是前端的必知技能。

2.2 介绍

Cache-Control:用来指定缓存机制。

缓存,作为前端八股文必考知识,相信大家已经耳熟能详。常见的 Cache-Control 属性如下:

Response Header属性 值 含义

cache-controlno-store不缓存,这个会让客户端、服务器都不缓存,也就没有所谓的强缓存、协商缓存了。cache-controlpublic表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age指令或Expires消息头;2. 该响应对应的请求方法是 POST 。)cache-controlprivate表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。cache-controlmax-age=设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。不缓存
不缓存是最容易理解,每一次请求都会从服务端重新获取,不进行任何缓存。
此策略只需要赋予 Cache-Control: no-store 响应头即可。强缓存
有些资源文件,几乎不会发生变化(比如已经 hash化命名的文件),则可以直接从本地缓存获取,这就是所谓的 强缓存 ;
通过 cache-control: public/private 或者 cache-control: max-age= 都可以指定机制为强缓存。协商缓存
这是一种更为复杂缓存机制,无法再通过响应头 简单粗暴地 指定实现,而是需要前后端协作配合。
简单来说,每次请求资源前前端会写代前一次的响应 hash,问询服务端 资源是否发生过变化,从而达到准确缓存的效果。
本文不赘述,如果有兴趣,可以参考此文:juejin.cn/post/703078…

2.3 实际生产如何运用?

凡是名称带有 hash 值的资源,一律可以强缓存。
(毕竟内容一旦有变化,名称的hash 也跟着变了)凡是通过 cdn 引入的第三方库,均建议携带版本信息,这样也可以强缓存。
(比如 /xx/xx/jquery.min.js 切换为 jquery@3.6.0/dist/jquery.min.js)凡是 htmlico 这类命名固定的文件,建议一律 不缓存 或者 协商缓存

三、我的 Cookie 不可能这么可爱!

3.1 场景

“春哥春哥,为啥我登录成功了,请求还是 401 ?”

“春哥春哥,为啥我存进 cookie 的值取不到?”

“春哥春哥,这破 cookie 是不是坏了,浏览器里看明明有值,为啥我访问不了?”

我:“兄弟,你有了解过一个叫 set-cookie 的响应头吗?”

3.png

是它!是它!就是它!关于 cookie 的各种异常,全靠它!

3.2 介绍

Cookie 曾经是 Web 开发无法绕开的一道门槛,而现在它的存在感越来越弱,但海量的存量项目并不会因为技术的趋势而消失,它们依然很有价值,依然需要维护。

set-cookie 响应头正是 Cookie 体系中最为核心的 第一主角

Set-Cookie: 是一个响应头,服务端赋值,让浏览器端产生 Cookie,并限定 Cookie 的各种特性。

这些特性就包括:

过期时限;Expires=存活周期;Max-Age=
在 cookie 失效之前需要经过的秒数。0-1 直接失效;此属性的优先级高于 Expires。域名;Domain=
指定 cookie 只能在什么域下生成;(允许通配,这个属性主要出于安全性)路径;Path=
Domain 更为细致的控制策略,甚至指定了 xx 路径下才能发送 Cookie。只在 Https 产生;Secure
如果 set-cookie 头中有 Secure 属性,那么浏览器只会在 Https 环境产生和发送 Cookie。禁用 js 操作 APIHttpOnly
如果 set-cookie 头中有 HttpOnly 属性,那么 Cookie 属性的生成、读写、发送就只能由浏览器通过 “响应头” 控制了,不在允许前端通过 js 操作 Cookie。是否允许跨域携带;SameSite=
支持属性包括 StrictLaxNone,分别表示:Strict: 完全不能跨域携带;Lax: 只允许从外站导航到源站时携带 CookieNone:跨域也行,不限制。

3.3 开发常见问题分析

为啥你登录成功了,请求还是 401

早期非常多的项目,使用 Cookie 作为用户身份识别的手段,比如 Spring MVC 项目就是通过给 Cookie 一个 JSeesionId 的值作为识别,判断你是否出于当前会话。

而 “登录了,却还 401” 这个现象,如果服务端没有问题的话,多半是 浏览器其实并未存储Cookie

换个说法,你每次发起请求,服务端都认为你是一次 新的会话,和上一次 登录的你 并非同一人。

如果你正处于 http 环境,那你可能需要暂时移除 Secure 属性。

存不进、取不出?
先确认 是否有域的限制是否有路径的限制是否有 HttpOnly?
逐一排查下来,问题不难解决。

(学习视频分享:web前端)

以上就是【整理总结】前端必知必会的几个实用响应头的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/545427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 17:20:28
下一篇 2025年11月9日 17:25:06

相关推荐

  • c++怎么处理json数据_C++解析与生成JSON数据的方法

    nlohmann/json库使C++处理JSON更高效,支持解析字符串、文件读写、生成格式化JSON,并提供类型检查与异常处理机制,集成简单且兼容C++11及以上版本。 在C++中处理JSON数据,由于标准库没有内置支持,通常需要借助第三方库来完成解析与生成。目前最常用且功能强大的库是 nlohma…

    2025年12月19日
    000
  • c++中如何使用数组实现双端队列_c++数组双端队列实现方法

    答案:使用固定大小数组和循环索引实现双端队列,通过front和rear指针支持两端插入删除。初始化时front和rear为0,利用取模运算实现循环,避免越界并提高空间利用率。提供判空、判满、插入、删除及访问首尾元素操作,适合理解底层机制,实际应用建议用std::deque。 在C++中,可以使用数组…

    2025年12月19日
    000
  • c++中如何实现LRU缓存_c++ LRU缓存实现方法

    使用哈希表和双向链表实现LRU缓存,通过unordered_map映射键到节点,双向链表维护访问顺序,get和put操作均O(1)时间完成,访问或插入时将节点移至链表头部,容量满时删除尾部最久未使用节点。 在C++中实现LRU(Least Recently Used)缓存,核心思路是结合哈希表和双向…

    2025年12月19日
    000
  • c++怎么使用Clang-Tidy进行静态代码分析_c++ Clang-Tidy静态分析方法

    c++kquote>使用 Clang-Tidy 可高效检测 C++ 代码中的潜在问题。它基于 Clang 编译器,支持可配置的检查项,能发现 bug、风格问题和不安全用法。首先需安装工具:Ubuntu/Debian 用 sudo apt install clang-tidy,Fedora 用 …

    2025年12月19日
    000
  • c++怎么播放音频或视频文件_c++音视频播放方法

    答案:C++中播放音视频需依赖第三方库,常用方法包括使用SFML播放音频、OpenCV结合FFmpeg播放视频画面、libVLC实现完整音视频同步播放,或采用Qt的Multimedia模块进行跨平台GUI集成。 在C++中播放音频或视频文件没有像Python或JavaScript那样内置的多媒体支持…

    2025年12月19日
    000
  • c++怎么进行代码混淆_c++代码混淆方法

    C++代码混淆通过重命名、控制流打乱、字符串加密和工具辅助提升逆向难度。1. 用无意义符号替换变量函数名,结合宏与脚本批量处理;2. 插入冗余逻辑、使用跳转或虚函数扰乱执行流程;3. 对敏感字符串采用XOR加密、分段拼接或编译期解密;4. 借助Obfuscator-LLVM、正则脚本或商业工具如Th…

    2025年12月19日
    000
  • C++如何发送HTTP请求_C++ HTTP请求发送方法

    C++中发送HTTP请求需借助第三方库,常用的是libcurl。首先安装libcurl,Linux可通过包管理器如sudo apt-get install libcurl4-openssl-dev,Windows可用vcpkg或手动编译。在代码中包含#include ,初始化CURL句柄,设置URL…

    2025年12月19日
    000
  • c++怎么使用WebAssembly编译C++代码_c++ WebAssembly编译C++方法

    使用Emscripten可将C++编译为WebAssembly。1. 安装emsdk并配置环境;2. 编写含extern “C”导出函数的C++代码;3. 用emcc生成wasm和js文件;4. 在HTML中通过Module调用_add等函数;5. 可选-s EXPORTED…

    2025年12月19日
    000
  • C++20的指定初始化(designated initializers)如何用于结构体

    C++20指定初始化器通过成员名赋值提升可读性与健壮性,必须按声明顺序使用,适用于聚合类型,避免混合初始化以减少复杂性。 C++20的指定初始化器(designated initializers)为结构体成员的初始化提供了一种更清晰、更安全的方式。简单来说,它允许你通过成员的名称来赋值,而不是仅仅依…

    2025年12月18日
    000
  • C++使用VSCode和CMake搭建项目环境方法

    答案是:在VSCode中通过安装编译器、CMake及C++扩展,创建CMakeLists.txt配置项目,利用CMake Tools扩展实现构建与调试。 在VSCode里用CMake搭建C++项目环境,其实就是把VSCode作为你的代码编辑器和调试前端,而CMake则负责生成跨平台的构建系统。核心思…

    2025年12月18日
    000
  • C++如何实现简单的贪吃蛇游戏

    C++实现贪吃蛇的核心在于控制台I/O、非阻塞输入、定时更新与状态管理,使用vector维护蛇身,通过头插尾删实现移动与增长,结合SFML或SDL可升级为图形化游戏。 用C++实现一个简单的贪吃蛇游戏,其实比很多人想象的要直接,它主要依赖于控制台的字符输出和基本的逻辑判断。核心思路是维护一个表示蛇身…

    2025年12月18日
    000
  • C++使用VSCode进行环境配置的步骤

    答案:配置VSCode的C++环境需安装VSCode、选择编译器(如MinGW-w64、MSVC或Clang)、安装C/C++扩展,并配置tasks.json和launch.json文件。具体步骤包括:下载安装VSCode;根据操作系统选择并安装对应编译器,Windows推荐MinGW-w64或MS…

    2025年12月18日
    000
  • C++在MacOS系统上如何安装编译器

    安装C++编译器首选Xcode Command Line Tools,执行xcode-select –install即可安装Clang等核心工具,再通过Homebrew扩展安装GCC或Boost等库,形成完整开发环境。 在macOS系统上安装C++编译器,最直接且推荐的方式是安装Xcod…

    2025年12月18日
    000
  • C++STL算法nth_element和partial_sort使用

    nth_element用于快速定位第n小元素,保证其前后的元素相对有序,平均时间复杂度O(n);partial_sort则将最小的n个元素排序置于前端,时间复杂度O(n log m),适用于Top K场景。根据是否需要有序结果选择:仅需第k元素用nth_element,需前k有序用partial_s…

    好文分享 2025年12月18日
    000
  • C++如何实现库存管理功能

    C++库存管理系统通过定义Item类和InventoryManager类,使用std::map存储商品信息,实现添加、删除、更新、查询及文件持久化功能,支持CSV格式数据读写,确保程序重启后数据不丢失。 在C++中实现库存管理功能,核心在于合理地设计数据结构来表示商品,并封装一系列操作(如添加、移除…

    好文分享 2025年12月18日
    000
  • C++开发购物清单管理工具方法

    答案:使用struct定义购物项,std::vector存储,ShoppingListManager类封装操作,CLI菜单交互,CSV文件持久化并处理I/O错误。 在C++中开发一个购物清单管理工具,本质上是围绕数据结构、核心功能实现以及数据持久化这几个点展开的。它要求我们将日常的购物需求,比如添加…

    2025年12月18日
    000
  • C++外观模式封装复杂系统内部逻辑

    外观模式通过提供统一接口简化复杂子系统调用,如CompilerFacade封装词法、语法分析等步骤,降低客户端耦合,提升可维护性。 C++中的外观模式,简单来说,就是为一套复杂的子系统提供一个统一的、高层次的接口。它就像一个总开关,把内部的千头万绪隐藏起来,让外部使用者能更轻松、更直观地操作。这不只…

    2025年12月18日
    000
  • C++像素画编辑器 简单绘图程序实现

    答案是C++%ignore_a_1%编辑器通过SDL2等图形库管理二维像素数组,利用事件循环处理鼠标输入,将坐标映射到逻辑像素并实时渲染纹理,实现高效绘图。其优势在于性能强、控制精细,挑战在于开发复杂度高。优化策略包括使用纹理批量渲染、避免逐像素绘制、采用脏矩形更新和硬件加速。扩展功能可涵盖撤销重做…

    2025年12月18日
    000
  • C++如何实现简单任务提醒程序

    答案:C++凭借其性能控制、静态类型安全和原生可执行特性,适合开发高效、可靠的任务提醒程序。通过定义Task结构体管理任务数据,利用文件I/O实现数据持久化,并使用std::chrono处理时间比较,程序能在每次运行时检查即将或已逾期任务,结合命令行交互提供基础但完整的提醒功能。 实现一个简单的C+…

    2025年12月18日
    000
  • C++访问者模式遍历复杂对象结构操作

    C++访问者模式通过双重分派机制将操作与对象结构分离,使新增操作无需修改元素类,符合开放/封闭原则,提升扩展性与维护性,适用于对象结构稳定但操作多变的场景。 C++的访问者模式(Visitor Pattern)提供了一种优雅的解决方案,用于在不修改复杂对象结构(比如树形结构或复合对象)内部类的前提下…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信