etag在expressjs中是如何工作的

etag在expressjs中是如何工作的,express,cache-control,etag,if-modified-since,Express,Cache Control,Etag,If Modified Since,Expressjs自动发送etag。我想知道etag是如何生成的。它是基于get例程动态生成的内容的。或者,我有没有办法维护它,甚至不必经历生成内容(动态内容-来自DB)的过程,也不必像以前一样传回etag 可能是一个中间件,首先检查它是否是有效的会话id,然后传回客户端提供的相同etag,或者可能基于url+会话id。这样它将是唯一的。在那里结束请求,而不是通过整个数据库调用和所有那些东西。在这种情况下,我需要知道客户正在打电话 我可以使用expires标签。但是当会话结束时。如果有人正在打开

Expressjs自动发送etag。我想知道etag是如何生成的。它是基于get例程动态生成的内容的。或者,我有没有办法维护它,甚至不必经历生成内容(动态内容-来自DB)的过程,也不必像以前一样传回etag

可能是一个中间件,首先检查它是否是有效的会话id,然后传回客户端提供的相同etag,或者可能基于url+会话id。这样它将是唯一的。在那里结束请求,而不是通过整个数据库调用和所有那些东西。在这种情况下,我需要知道客户正在打电话

我可以使用expires标签。但是当会话结束时。如果有人正在打开url,则不应允许。所以我认为etag也应该基于会话id。在这个动态内容场景中,if-modified是如何工作的。可以使用它。

在撰写本文时(2014年7月8日),弱ETag使用()生成,强ETag使用MD5()生成

,您可以通过以下方式指定是使用强ETag还是弱ETag:

app.enable('etag') // use strong etags
app.set('etag', 'strong') // same
app.set('etag', 'weak') // weak etags
看起来您还可以指定自己的自定义函数来执行ETag,如下所示:

app.set('etag', function(body, encoding){ /* return valid etag */ });
NPM包也值得一看,因为它在Express中用于新鲜度检查(,)


对于您的应用程序,请记住,在调用
res.send()
(或类似函数)之前,您可以覆盖任何响应头,例如
res.set('etag','my awesome etag value')
。进一步的讨论(包括优点和缺点)可以在这里找到:

让我在2021年解释一下,并提供最新信息和代码链接

这是一个相对简单明了(没有火箭科学)的概念,但同时也是一件非常棘手的事情,作为一名开发人员,在它咬你之前,你应该真正了解它

什么是Etag? 因此,Etag(per)是一个HTTP头

它可以在DevTools中一些GET调用的“响应标题”部分看到,如下面的屏幕截图

在Express中,它可以以
W/
(弱,默认值)或非(强)开头,然后是
-
,其中值的长度为27个字符,LEN是十六进制值的长度。()

Etag的目的是什么? 啊,好问题。答案是:缓存

(注:仅缓存客户端和服务器之间的网络流量。这是响应数据的传输,通过HTTP发送到客户端;而不是服务器到DB的任何内部缓存或其他形式。)

如何缓存? 机制相对简单

假设一个客户端(浏览器,比如Chrome)调用
https://myserver.com/user/profile/get
endpoint并获取当前用户的所有配置文件数据的大JSON响应(例如,姓名、电话、照片URL等30个字段)。除了将响应作为JSON对象传递给您的应用程序之外,客户端在其自己的私有内部网络层中,还将把这些数据存储在
{https://myserver.com/users/profile/get“:}

现在,下一次(甚至几天以后和会话以后)客户端将要调用
../user/profile/get
的同一个端点时,它可以告诉服务器“嘿,我的缓存中有这个,所以如果你要发送的正是这个,就不要发送过来。”

很酷,但这不是很低效吗? 是的

问题是,如果客户机在请求中从缓存发送整个JSON对象到服务器,这既有安全风险,也非常低效——相同的30字段JSON对象通过网络发送,甚至可能发送两次

这里发生的事情是,客户端(即Chrome浏览器)可以计算一个散列(比如MD5,它是不可逆的和更短的),然后在第二个请求中说“嘿,如果你要发送给我的JSON的MD5散列是这个
,我已经有了它!所以不要发送过来。”

现在,发生的事情是,服务器将像以前一样计算响应(从DB和所有内容中提取)。但是,仅在发送响应数据之前,会计算响应的哈希值(在服务器端),以查看它是否与客户端所说的匹配。如果是这样,它将发送一个304 HTTP状态响应代码,而不是200,这意味着“没有任何更改”

美好的就是这个吗? 好的,在上面的例子中,如果您密切注意,哈希计算在客户端和服务器端都在进行。这至少会使改变算法变得困难。因此,在现实中,“响应哈希”实际上也是第一次在服务器端计算,并将发送回客户端

“当前响应”的计算散列(随响应返回)位于响应的
ETag
头中

这样,每当客户端接收到响应时,它都会将:
{“../profile/get”:[,]}
存储在其内部缓存中

然后,在任何未来的请求中,客户端将向服务器发送此
ETag
值(在一些头中,如
如果不匹配,则表示它可以接收304,如果新呼叫的响应将具有此
ETag

因此,总结一下:

  • ETag
    值并不是什么疯狂的东西,而是响应数据(body)的一个不可逆、短且快速的散列值
  • 服务器在响应中向客户端发送
    ETag
  • 如果在请求中没有匹配的
    头(其值以前从服务器收到
    Etag
    值),客户端将
    发送到服务器

伟大的我如何使用它? 默认情况下,它发生在Express.js中。所以,坐下来享受吧

您不太可能需要弄乱它的设置

什么时候应该