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

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

阅读本文,你将:

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

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

学习 响应头 很重要吗?

真的很重要。

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

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

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

相关推荐

  • 如何使用 vue-color 创建交互式颜色渐变页面?

    如何创建交互式颜色渐变页面? 实现交互式颜色渐变页面可以通过利用第三方库来简化开发流程。 推荐解决方案: vue-color 立即学习“前端免费学习笔记(深入)”; vue-color是一个vue.js库,提供了一个功能强大的调色板组件。它允许你轻松创建和管理颜色渐变。 特性: 颜色选择器:选择单一…

    2025年12月24日
    200
  • 如何利用 vue-color 库打造交互式色彩渐变页面?

    打造交互性前端:色彩渐变页面的制作方法 在前端开发中,色彩渐变页面和交互式元素深受设计师和开发人员的欢迎。本文将探讨如何利用 vue-color 库轻松实现这样的页面。 使用 vue-color 库构建调色板 vue-color 是一个 vue.js 库,可用于创建可定制的调色板。其基本功能包括: …

    2025年12月24日
    300
  • 如何使用前端技术创建交互式颜色渐变页面?

    如何创建交互式颜色渐变页面? 当您希望在前端界面实现颜色渐变效果并实现交互功能时,可以使用以下方法: 解决方案: 1. 使用 vue-color 库 vue-color 库是一个功能强大的 vue.js 库,可用于创建色板和处理颜色操作。它可以帮助您轻松实现颜色渐变效果,如下所示: 立即学习“前端免…

    好文分享 2025年12月24日
    000
  • Vue 中如何动态添加带有动态样式的伪元素?

    vue 动态添加具有动态样式的伪元素 在某些情况下,需要根据动态条件向 dom 元素添加带有动态样式的伪元素。例如,元素的伪元素“before”可能只有在满足特定条件时才会出现,并且其样式(如长度、高度和其他属性)也是不确定的。 解决方案:css 变量 由于伪元素的样式不能直接在 css 中定义,可…

    2025年12月24日
    000
  • Vue 中如何动态添加伪元素?

    vue中如何动态添加伪元素 在某些情况下,需要动态地为元素添加伪元素,但传统方法受限于伪元素不能写死在 css 中。本文将介绍一种使用 css 变量解决此问题的方法。 使用 css 变量 css 变量允许在样式表中定义可重复使用的变量,然后可以在其他样式中使用这些变量。利用这个特性,我们可以动态地控…

    2025年12月24日
    100
  • 如何使用 CSS 变量动态控制 Vue 应用中 DOM 伪元素的样式?

    灵活操纵 vue 中 dom 伪元素 在 vue 应用中,有时需要在特定条件下动态添加和修改伪元素样式。虽然 css 中的伪元素通常是静态定义的,但有些情况下,需要根据用户的行为或数据动态调整其样式。 动态控制伪元素样式 可以使用 css 变量来解决此问题。css 变量允许您在样式表中存储可变值,然…

    2025年12月24日
    100
  • Vue中如何利用CSS变量动态操纵伪元素样式?

    利用css变量动态操纵伪元素 在vue中,有时需要动态地给dom元素添加伪元素,并且伪元素的样式也是动态变化的。不能在css文件中直接定义伪元素样式,因为伪元素包含动态参数。 这个问题的解决方法之一是使用css变量。css变量允许我们在css中定义变量并动态地将其分配给元素的样式。 代码示例: 立即…

    2025年12月24日
    300
  • HTMLrev 上的免费 HTML 网站模板

    HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

    2025年12月24日
    300
  • Vue/UniApp 中如何实现选中效果的切换?

    vue/uniapp中复现选中的效果 在vue/uniapp中实现此效果,可以使用view元素和样式类来控制外观。让我们来看看这个问题的示例代码。 日 周 月 年 .tabs { display: flex; justify-content: space-between; flex-directio…

    2025年12月24日
    000
  • 如何简化五子棋代码中的重复部分?

    五子棋代码简化 问题: 如何简化五子棋代码中重复的部分? 问题内容: 提供了vue编写的五子棋代码,但其中有多个重复的部分。希望得到一个更简化的代码版本。 问题答案: 拆分重复方法 将大方法中的重复部分拆分成更小的函数,例如: placepiece():放置棋子checkandplace():检查某…

    2025年12月24日
    000
  • Vue/Uniapp 中如何实现类似图片所示的日周月年切换标签效果?

    vue/uniapp中,如何实现类似图片中效果的日周月年切换标签? 图片中呈现了四个标签,选中”日”后,背景变成蓝色,字体变成白色。而其他未选中的标签,背景为灰色,字体也呈灰色。 一位网友通过纯html实现了一个简易的版本,代码如下: 日 周 月 年 具体效果,可以点开上面的…

    2025年12月24日
    000
  • Vue/UniApp中如何制作圆角选项卡,且选中状态颜色与未选中状态颜色不同?

    vue/uniapp中,如何制作圆角栏目的选项卡效果? 你想要创建一个圆角栏目的选项卡效果,其中一个选中的选项是用白色文本填充蓝色背景,而其他选项是黑色文本填充灰色背景。 以下是使用html和css实现此效果的方法: 日 周 月 年 .tabs { display: flex; justify-co…

    2025年12月24日
    000
  • Vue2表格隐藏列后,固定列出现空白行怎么办?

    vue2表格隐藏列导致固定列空白行 当使用vue2表格库(例如element-table)时,隐藏其中一列可能会导致固定列(通常包含操作按钮)最上方出现空白行。 解决方案 要解决此问题,需要在切换列显示状态后手动调用dolayout()方法。该方法会重新计算表格的布局,消除空白行。 立即学习“前端免…

    2025年12月24日
    000
  • 如何优化 Vue 五子棋程序中的重复代码?

    简化代码 问题: 一个使用 vue 编写的五子棋程序中存在大量重复代码,需要进行简化。 代码重复: 立即学习“前端免费学习笔记(深入)”; 部分的 clickbox 函数中重复的条件检查和棋子放置逻辑。 部分的 aripoint 函数中重复的四种条件检查和棋子放置逻辑。 部分的 determinee…

    2025年12月24日
    100
  • Vue/UniApp 选项卡选中时如何添加边框和背景色?

    vue/uniapp中选中时有边框和背景色的选项卡如何实现 原帖中提供的代码不能实现选中时有边框和背景色的效果。下面是用 html 实现这种效果的代码: Document 日 周 月 年 .tabs { display: flex; justify-content: space-between; f…

    2025年12月24日
    000
  • 如何使用 Vue/Uniapp 实现美观实用的“选框”样式页面元素?

    vue/uniapp页面设计优化 在vue/uniapp中,为实现类似“选框”样式的页面元素,可采用以下优化方案: 创建层叠布局(flex layout): 设置外层容器的显示方式为“flex”,并启用水平排列。 定义“选框”元素: 立即学习“前端免费学习笔记(深入)”; 为每个“选框”创建一个子元…

    2025年12月24日
    000
  • 让我们只用一根安装线就可以使网络响应起来吗?我正在寻找贡献者!

    最近我发布了一个 npm 包,其使命如标题所示:让项目只需一行代码即可响应! 我与您分享响应式应用程序 [beta] 包 我花了几年时间尝试和开发这项技术,目前包括: 动态设置 html 标签字体大小(通过 js 脚本),考虑:(1) 屏幕分辨率和 (2) 浏览器字体大小(用于网络可访问性)将像素定…

    2025年12月24日
    000
  • uniapp/vue 中父元素 pointer-events: none 如何让子元素点击事件生效?

    在 uniapp/vue 中解决父元素 pointer-events: none 下子元素点击事件无效的问题 在使用 uniapp/vue 时,当父元素设置了 pointer-events: none 属性后,子元素的点击事件可能会失效。 问题分析 当父元素设置为 pointer-events: n…

    2025年12月24日
    200
  • 如何将 Element UI 的 CSS 文件优雅地引入本地项目?

    如何优雅地引入 element ui 的 css 文件? element ui 是一个非常流行的前端 ui 框架,它的样式表通常通过 cdn url 引入,但偶尔 cdn 会出现访问不稳定的情况,导致样式无法正常加载。为了解决这个问题,我们可以将样式文件下载到本地。 引入本地样式文件的步骤如下: 下…

    2025年12月24日
    000
  • UniApp/Vue 中如何让父元素 Pointer-Events: None 下的子元素点击生效?

    在 uniapp/vue 中让父元素 pointer-events: none 下的子元素点击生效 当我们设置父元素的 pointer-events 为 none 时,它将阻止鼠标或触摸事件传递给子元素。在这种情况下,底部的点击事件将无法生效。 要解决此问题,可以给需要点击事件的子元素添加 poin…

    2025年12月24日
    200

发表回复

登录后才能评论
关注微信