如果单击超链接,请使浏览器提交其他HTTP-Header

gue*_*tli 14 javascript django http-referer http

如果用户点击链接,有没有办法让webbrowser提交额外的HTTP标头?

背景:在我们的环境中,每个http请求在服务器端都有唯一的ID.请参阅https://serverfault.com/questions/797609/apache-x-request-id-like-in-heroku

如果您的Web应用程序收到http请求,我想知道之前页面是哪个页面.http referrer是不够的,因为用户可以在他的浏览器中使用多个选项卡.

我想避免将丑陋的request-id放入从浏览器发送到服务器的每个GET请求中.到目前为止,我们的网址很好.

我首选的解决方案是一些JavaScript魔术,它将当前页面的请求ID添加到下一个http请求中.

详细步骤:

  1. 浏览器访问网址http://example.com/search
  2. Web服务器接收带有请求ID 123的http请求
  3. Web服务器将URL的内容发送到浏览器(搜索页面).该页面包含某处的请求ID 123
  4. 用户搜索"foobar".
  5. Web浏览器向服务器提交http请求,并以某种方式包含先前的请求ID.
  6. Web服务器接收第二个http请求(ID 456)并且可以某种方式访问​​第一个请求(ID 123)的值.
  7. Web服务器可以将关系"123 - > 456"存储在数据库中以供以后分析.

我的目标是跟踪关系"123 - > 456".以上解决方案只是实现目标的策略.其他策略是受欢迎的.

我们使用web框架django.但AFAIK在这方面确实很重要.

用户可以在浏览器中使用多个选项卡

我详细说明了匹配解决方案的含义.来自一个用户的请求序列不能解决问题.

使用多个选项卡:

  1. 用户查看tab1中的页面A.
  2. 用户查看tab2中的页面B.
  3. 用户按照第A页到第C页的链接
  4. 用户按照页面C到页面D的链接
  5. 用户按照第B页(第2页)到第E页的链接.

我想知道看到两个序列:

A -> C -> D
Run Code Online (Sandbox Code Playgroud)

B -> E
Run Code Online (Sandbox Code Playgroud)

Eve*_*ert 10

这里唯一现代的"理智"选择是使用ServiceWorker.

ServiceWorker可以拦截您控制的域的HTTP请求,并使用更多标头对其进行装饰.

ServiceWorker在浏览器选项卡的"外部"工作,如果使用同一网站打开多个选项卡,则将为所有这些选项卡使用相同的服务工作程序.

关于如何实现这一目标的完整教程对于这个答案框来说肯定是太多了,但拦截和处理HTTP请求是一个很大的用例,所以非现场源通常会以此为例.

我会说这是一个坏主意.如果你认为你需要这个,也许你可以用不同的方式处理这个问题.执行此操作的常用方法可能是使用Cookie.