직장에서 직면하는 문제를 해결하기 위해 몇 가지 매우 실용적이고 실용적인 응답 헤더를 알아보세요.
문제를 해결할 뿐만 아니라 백엔드와 운영 및 유지 관리와 충돌할 때 우위를 점할 수 있는 기능도 제공합니다.
정말 중요해요.믿을 수 없다면 아래 장면을 살펴보세요. 친숙해 보이죠?
"백엔드는txt
( 또는url
은a
태그를 사용하면 열 수 있지만 미리보기가 됩니다. .. 어떻게 해야 하나요? 저장! "
txt
(或者url
,可以当我用a
标签打开时,却变成了预览……怎么办?救!!!”
此时,就会有人上去推荐 FileSaver.js
或者 “手写读流另存为”。
然后还有人附和...
我:???
这是需要写代码才能解决的问题吗?
如果你有了解过 Content-Disposition
这个 Response Header
,那你一定知道,只需要响应头上增加一行,问题就能迎刃而解。
Content-Disposition
:这个响应头可以决定内容是 预览 还是 下载。
它支持三种格式的值:
Content-Disposition: inline
此时,消息体会以页面的一部分或者整个页面的形式展示。(预览)
Content-Disposition: attachment
消息体应该被下载,默认文件名和 url
格式有关。
Content-Disposition: attachment; filename="filename.jpg"
消息体应该被下载,默认文件名可指定。
注:如果需要预览,需要配合适当的
Content-Type
食用;
为此,我特意写了一个 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) }
然后我分别访问三个路由,效果差异:
实施:“客户反馈Bug
还是没修复。”
你:“哥,真修复了,要不你让客户清一下缓存?”
实施:“啊?客户说他不会清……”
……
永远不要期望你的客户会进行 “那些研发才懂” 的操作。也不要把你的问题,归因到 浏览器缓存 上。
浏览器缓存 是被发明出来优化用户体验的,并不是被发明出来阻碍用户的。
因此,理解如何使用 Cache-Control
这个响应头,是前端的必知技能。
Cache-Control
이때 누군가가 와서 FileSaver.js
또는 "손글씨 읽기 스트림을 다른 이름으로 저장"을 추천할 것입니다.
그때 다른 사람이 울렸는데...Cache-Control
나:? ? ?
Content-Disposition
의 응답 헤더
에 대해 알고 계시다면, 응답 헤더에 한 줄만 추가해도 문제가 해결된다는 점을 아셔야 합니다. 🎜Content-Disposition
🎜: 이 응답 헤더는 콘텐츠가 🎜preview🎜 또는 🎜download🎜인지 여부를 결정할 수 있습니다. 🎜🎜3가지 형식의 값을 지원합니다: 🎜🎜🎜🎜Content-Disposition: inline
Content-Disposition: attachment
url
형식과 관련됩니다. 🎜🎜🎜🎜Content-Disposition: attachment; filename="filename.jpg"
Content-Type
을 사용해야 합니다. 🎜🎜express
의 작은 예제를 작성했습니다. 🎜🎜아마 express
애플리케이션에서 다음과 같이 세 가지 경로를 작성했을 것입니다. 🎜rrreee🎜그런 다음 세 경로에 각각 액세스했는데 효과가 달랐습니다. 🎜🎜🎜버그
가 아직 수정되지 않았습니다."응답 헤더 속성 | value | meaning |
---|---|---|
cache-control | no-store | 캐싱이 없습니다. 이렇게 하면 클라이언트나 서버 모두 캐시되지 않으며 그렇게 할 필요가 없습니다. 강력한 캐시라고 하며 캐시를 협상합니다. |
cache-control | public | 은 일반적으로 캐시할 수 없는 콘텐츠에 대해서도 누구나(요청하는 클라이언트, 프록시 서버 등 포함) 응답을 캐시할 수 있음을 나타냅니다. (예: 1. 이 응답에는 max-age 지시어 또는 Expires 헤더가 없습니다. 2. 이 응답에 해당하는 요청 방법은 POST입니다.) |
cache-control | private | 은 응답이 다음을 수행할 수 있음을 나타냅니다. 단일 사용자만 캐시할 수 있습니다. 공유로 캐시할 수 없습니다(즉, 프록시 서버가 캐시할 수 없음). 개인 캐시는 예를 들어 사용자의 로컬 브라우저에 해당하는 응답 콘텐츠를 캐시할 수 있습니다. |
cache-control | max-age= | 캐시가 만료된 것으로 간주되는 최대 캐시 저장 기간(초)을 설정합니다. 만료와 달리 시간은 요청 시간을 기준으로 합니다. |
Cache-Control: no-store
응답 헤더만 제공하면 됩니다. Cache-Control: no-store
响应头即可。hash化命名的文件
),则可以直接从本地缓存获取,这就是所谓的 强缓存 ;cache-control: public/private
或者 cache-control: max-age=
都可以指定机制为强缓存。hash
,问询服务端 资源是否发生过变化,从而达到准确缓存的效果。hash
值的资源,一律可以强缓存。hash
也跟着变了)cdn
引入的第三方库,均建议携带版本信息,这样也可以强缓存。/xx/xx/jquery.min.js
切换为 jquery@3.6.0/dist/jquery.min.js
)html
、ico
这类命名固定的文件,建议一律 不缓存 或者 协商缓存。Cookie
不可能这么可爱!"春哥春哥,为啥我登录成功了,请求还是
401
?"
"春哥春哥,为啥我存进
cookie
的值取不到?"
"春哥春哥,这破
cookie
是不是坏了,浏览器里看明明有值,为啥我访问不了?"
我:“兄弟,你有了解过一个叫 set-cookie
的响应头吗?”
是它!是它!就是它!关于 cookie
的各种异常,全靠它!
Cookie
曾经是 Web
开发无法绕开的一道门槛,而现在它的存在感越来越弱,但海量的存量项目并不会因为技术的趋势而消失,它们依然很有价值,依然需要维护。
而 set-cookie
响应头正是 Cookie
体系中最为核心的 第一主角。
Set-Cookie
: 是一个响应头,服务端赋值,让浏览器端产生 Cookie
,并限定 Cookie
강력한 캐싱
해시 이름
이 지정된 파일)은 거의 변경되지 않으며, 이를 로컬 캐시에서 직접 얻을 수 있습니다. 강력한 캐싱 ; cache-control: public/private
또는 cache-control: max-age=을 통해 메커니즘을 강력한 캐싱으로 지정할 수 있습니다.
.
해시
를 작성하고 리소스가 변경되었는지 서버에 묻습니다. 정확한 캐싱 효과를 얻습니다. 🎜이 기사에서는 자세히 다루지 않겠습니다. 관심이 있으시면 다음 기사를 참조하세요. juejin .cn/post/703078…해시
값이 포함된 모든 리소스는 강력하게 캐시될 수 있습니다. 🎜(결국 내용이 변경되면 이름의 해시
도 변경됩니다.)🎜cdn
을 통해 소개된 타사 라이브러리는 모두 휴대하는 것이 좋습니다. 버전 정보를 제공합니다. 이를 통해 강력한 캐싱도 가능해집니다. 🎜(예를 들어 /xx/xx/jquery.min.js
는 jquery@3.6.0/dist/jquery.min.js
로 전환됩니다.)🎜 모든 html 및 ico
와 같은 고정된 이름을 가진 파일의 경우 캐시하지 않거나 캐시를 협상하는 것이 좋습니다. 쿠키
가 이렇게 귀여울 수가 없어요! 🎜"전 형제님, 천 형제님, 제가 왜 로그인에 성공했을까요? ? 요청이 여전히 401
인가요? "🎜
🎜"천 형제님, 제가cookie
에 저장한 값을 왜 가져올 수 없나요?🎜"천 형제님, 천 형제님, 이🎜나: "형제 ,쿠키
가 깨졌나요? 브라우저에서 확실히 중요한데 왜 액세스할 수 없나요?"🎜set-cookie
라는 응답 헤더에 대해 들어보신 적이 있나요?" 🎜🎜🎜바로 그거예요! 그게 다야! 그게 다야!
쿠키
에 관한 모든 종류의 예외가 여기에 달려 있습니다!🎜3.2 소개
🎜쿠키 / code>는 예전에는 <code>웹
개발에서 우회할 수 없는 문턱이었는데, 지금은 그 존재감이 점점 약해지고 있지만, 기술 동향 때문에 대규모 스톡 프로젝트가 사라지지는 않을 것입니다. important 중요 가치가 있지만 여전히 유지 관리가 필요합니다. 🎜🎜set-cookie
응답 헤더는쿠키
시스템의 핵심 첫 번째 주인공입니다. 🎜🎜Set-Cookie
: 서버에서 할당한 응답 헤더로, 브라우저가쿠키
를 생성하고쿠키를 제한할 수 있습니다. . 🎜🎜이러한 기능은 다음과 같습니다.🎜<ul> <li>만료 시간 제한; <code>Expires=<date></date>
Expires=<date></date>
存活周期; Max-Age=<number></number>
在 cookie 失效之前需要经过的秒数。0
或-1
直接失效;此属性的优先级高于Expires
。域名; Domain=<domain-value></domain-value>
指定cookie
只能在什么域下生成;(允许通配,这个属性主要出于安全性)路径; Path=<path-value></path-value>
比Domain
更为细致的控制策略,甚至指定了xx
路径下才能发送Cookie
。只在 Https
产生;Secure
如果set-cookie
头中有Secure
属性,那么浏览器只会在Https
环境产生和发送Cookie
。禁用 js
操作API
;HttpOnly
如果set-cookie
头中有HttpOnly
属性,那么Cookie
属性的生成、读写、发送就只能由浏览器通过 "响应头" 控制了,不在允许前端通过js
操作Cookie
。是否允许跨域携带; SameSite=<samesite-value></samesite-value>
支持属性包括Strict
、Lax
、None
,分别表示:
Strict
: 完全不能跨域携带;Lax
: 只允许从外站导航到源站时携带Cookie
None
:跨域也行,不限制。3.3 开发常见问题分析
为啥你登录成功了,请求还是
401
?早期非常多的项目,使用
Cookie
作为用户身份识别的手段,比如Spring MVC
项目就是通过给Cookie
一个JSeesionId
的值作为识别,判断你是否出于当前会话。而 "登录了,却还
401
" 这个现象,如果服务端没有问题的话,多半是 浏览器其实并未存储Cookie。换个说法,你每次发起请求,服务端都认为你是一次 新的会话,和上一次 登录的你 并非同一人。
如果你正处于
http
环境,那你可能需要暂时移除Secure
属性。- 도메인 이름;
存不进、取不出?
先确认 是否有域的限制、是否有路径的限制、是否有HttpOnly
Lifetime;Max-Age=<number></number>
쿠키가 지나야 하는 시간(초) 만료됩니다.0
또는-1
은 직접적으로 유효하지 않습니다. 이 속성은Expires
보다 우선순위가 높습니다.Domain=<domain-value></domain-value>
쿠키
만 생성할 수 있는 도메인을 지정하세요. 와일드카드는 주로 보안을 위한 것입니다. )Path;
. 🎜Path=<path-value></path-value>
Domain
보다 더 자세한 제어 전략,xx
경로를 쿠키Https
에서만 생성됩니다.Secure
🎜set-cookie
헤더에Secure
속성이 있는 경우 브라우저쿠키
는Https
환경에서만 생성되고 전송됩니다. 🎜🎜js
작업API
를 비활성화합니다.HttpOnly
🎜set-cookieHttpOnly
가 있는 경우 /code> 헤더 code> 속성을 사용하면쿠키
속성의 생성, 읽기, 쓰기 및 전송은 "응답 헤더"를 통해서만 브라우저에서만 제어할 수 있으며 프런트 엔드는 더 이상js
>쿠키를 통해를 운용할 수 있습니다. 🎜🎜도메인 간 이식성이 허용되는지 여부;
SameSite=<samesite-value></samesite-value>
🎜지원되는 속성에는Strict
,Lax
,가 포함됩니다. 없음, 각각: 🎜🎜<code>엄격
: 도메인 간에 전혀 전달될 수 없습니다. 🎜🎜Lax
: 다음에서 탐색할 때만쿠키가 전달되도록 허용합니다. 원본 사이트에 대한 외부 사이트
🎜🎜없음
: 교차 도메인도 허용되며 제한이 없습니다. 🎜🎜🎜🎜3.3 개발 FAQ 분석🎜
🎜🎜🎜성공한 후에도 요청이 여전히401
인 이유는 무엇입니까? 로그인했나요? 🎜🎜많은 초기 프로젝트에서는 사용자 식별 수단으로Cookie
를 사용했습니다. 예를 들어Spring MVC
프로젝트에서는Cookie
에값을 부여했습니다. JSeesionId
는 현재 세션에 있는지 확인하기 위한 식별로 사용됩니다. 🎜🎜로그인했는데 여전히401
' 현상이 발생하는 경우, 서버 측에 문제가 없다면 브라우저가 실제로 쿠키를 저장하지 않기 때문일 가능성이 높습니다🎜. 🎜🎜즉, 요청을 할 때마다 서버는 귀하를 새로운 세션🎜으로 간주하며, 귀하는 마지막 로그인🎜과 동일한 사람이 아닙니다. 🎜🎜http
환경에 있는 경우Secure
속성을 일시적으로 제거해야 할 수도 있습니다. 🎜🎜🎜🎜입출금이 안되나요? 🎜먼저 도메인 제한이 있는지🎜, 경로 제한이 있는지🎜,HttpOnly
🎜가 있는지 확인하세요.🎜 하나씩 확인하면 문제가 해결됩니다. 어렵지 않게 해결하세요. 🎜🎜🎜🎜 (학습 영상 공유: 🎜웹 프론트엔드🎜)🎜
위 내용은 [편집 및 요약] 프론트엔드가 꼭 알아야 할 몇 가지 실용적인 응답 헤더의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!