javascript - 如果单击超链接,使浏览器提交额外的 HTTP-Header
问题描述
如果用户点击链接,有没有办法让网络浏览器提交额外的 HTTP 标头?
背景:在我们的环境中,每个 http-request 在服务器端都有一个唯一的 ID。请参阅https://serverfault.com/questions/797609/apache-x-request-id-like-in-heroku
如果您的 Web 应用程序收到一个 http 请求,我想知道哪个页面是之前的页面。http referrer 是不够的,因为用户可以在他的浏览器中使用多个选项卡。
我想避免将丑陋的请求 ID 放入从浏览器发送到服务器的每个 GET 请求中。到目前为止,我们的 URL 都很好。
我更喜欢的解决方案是一些 JavaScript 魔术,它将当前页面的请求 ID 添加到下一个 http 请求中。
详细步骤:
- 浏览器访问 URL http://example.com/search
- Web 服务器接收请求 ID 为 123 的 http 请求
- Web 服务器将 URL 的内容发送到浏览器(搜索页面)。该页面在某处包含请求 ID 123
- 用户搜索“foobar”。
- Web 浏览器向服务器提交一个 http 请求,并以某种方式包含先前的请求 ID。
- Web 服务器接收到第二个 http 请求(ID 456)并且可以以某种方式访问第一个请求(ID 123)的值。
- Web 服务器可以将关系“123 --> 456”存储在数据库中以供以后分析。
我的目标是跟踪关系“123 --> 456”。上述解决方案只是实现目标的策略。欢迎其他策略。
我们使用网络框架 django。但是 AFAIK 这在这种情况下确实很重要。
用户可以在他的浏览器中使用多个标签
我详细说明了这对匹配解决方案意味着什么。来自一个用户的一系列请求并不能解决问题。
与多个选项卡一起使用:
- 用户在 tab1 中查看页面 A
- 用户在 tab2 中查看页面 B
- 用户点击页面 A 上的链接到页面 C
- 用户点击页面 C 上的链接到页面 D
- 用户通过页面 B (tab2) 上的链接到页面 E。
我想知道看两个序列:
A -> C -> D
和
B -> E
解决方案
这里唯一的现代“理智”选项是使用 ServiceWorker。
ServiceWorker 可以拦截您控制的域的 HTTP 请求,并用更多标头装饰它。
ServiceWorker 在浏览器选项卡的“外部”工作,如果在同一个网站上打开多个选项卡,则所有这些选项卡都将使用同一个服务工作者。
关于如何完成的完整教程对于这个答案框来说绝对是太多了,但是拦截和处理 HTTP 请求是一个很大的用例,因此场外来源通常会以此为例。
我会说这是一个坏主意。如果你认为你需要这个,也许你可以用不同的方式来处理它。执行此操作的常用方法可能是使用 cookie。
推荐阅读
- .net - dotnet publish 没有 dotnet build 中存在的一些 Nuget 依赖项
- python - 通过 selenium 从 hotmail 中提取电子邮件
- curl - 使用带有输出文件名参数的 lftp 下载文件
- c++ - 如何从 Fortify fpr 文件中获取更多详细信息?
- c - 查询时发生 TDengine 断言
- android - 如何在后台线程中打开 URL,以便我可以解析 XML 并获取值
- python - 如何减少代码中“if”语句的数量?
- sas - 为所有具有units= 0的初始观察设置flag=0
- swift - 如何获取动态 List / ForEach 可绑定元素的索引(新 Xcode 13 的语法)?
- javascript - 如何将 vue-emoji-picker 选择的表情符号与文本一起保存到数据库?