ユーザーがリンクをクリックしたときに、Webブラウザーが追加のHTTPヘッダーを送信する方法はありますか?
背景:この環境では、すべてのhttp-requestにサーバー側で一意のIDがあります。 https://serverfault.com/questions/797609/Apache-x-request-id-like-in-herok を参照してください
Webアプリケーションがhttp-requestを受け取った場合、どのページが以前のページだったかを知りたいです。 ユーザーがブラウザで複数のタブを使用できるため、httpリファラーでは不十分です。
ブラウザからサーバーに送信されるすべてのGETリクエストにいrequest-idを配置することは避けたいと思います。これまでのところ、URLは素晴らしいものです。
私が好む解決策は、現在のページのrequest-idを次のhttpリクエストに追加するJavaScriptマジックです。
詳細な手順:
私の目標は、リレーションシップ「123-> 456」を追跡することです。上記のソリューションは、目標を達成するための戦略にすぎません。他の戦略も歓迎します。
WebフレームワークDjangoを使用します。しかし、これはこのコンテキストでは重要です。
ユーザーはブラウザで複数のタブを使用できます
マッチングソリューションにとってそれが何を意味するかを詳しく説明します。 1人のユーザーからのリクエストのシーケンスは問題を解決しません。
複数のタブを使用する1回の使用:
2つのシーケンスが表示されることを知りたい:
A -> C -> D
そして
B -> E
ここでの唯一の最新の「健全な」オプションは、ServiceWorkerを使用することです。
ServiceWorkerは、制御するドメインのHTTP要求をインターセプトし、より多くのヘッダーで装飾できます。
ServiceWorkerはブラウザータブの「外側」で動作し、同じWebサイトで複数のタブが開いている場合、すべてのタブに同じserviceworkerが使用されます。
これを達成する方法に関する完全なチュートリアルは、この回答ボックスには間違いなく多すぎますが、HTTPリクエストを傍受して処理することは大きなユースケースです。
これはちょっと悪い考えだと思います。これが必要だと思われる場合は、別の方法で処理できます。これを行う一般的な方法は、代わりにCookieを使用することです。
まず第一に、私の英語を申し訳ありません。
編集内容を読んだ後、タブが原因で私の答えがまったく合わないことに気付きました。
ブラウザがgetリクエストを行う方法を直接変更することはできません。それを知って、あなたの可能性は:
localStorage
を使用する代わりに、値がsessionStorage
を使用する必要がありますタブに依存しない。また、ルート全体を保存する代わりに、ランダムIDのみを保存する必要があります。このIDは、特定のタブに対するリクエストのチェーンの識別として機能します。次に、たとえばRequest-ID
を使用して、Webサーバーが各<meta name="request_id" content="123" />
を返すと、特定の追跡エンドポイントとストアにajax経由でリクエストを行うだけで済みます:ルートを保存するリクエストは、ページのロード前ではなくロード後に行われます。このアプローチは、Analyticsの動作に非常に似ています。
// generate an unique code and store it in sessionStorage.
if (!sessionStorage.getItem('chain_id')) {
sessionStorage.setItem('chain_id', 'a7835e0a-3ee9-e981-...');
}
// Then, if you use JQuery:
$(document).ready(function() {
$.ajax({
type: "POST",
url: 'your/tracking/endpoint/',
data: {
'chain_id': sessionStorage.getItem('chain_id'),
'request_id': document.querySelector("meta[name='request_id']").getAttribute('content'),
}
});
});
注:JQueryを使用して追跡要求を処理しないでください。ドキュメントが完全にロードされるまで待機することもできません。これは単なる例です。
そしてそれだけです。ユーザーエージェント、チェーン、リクエスト、リクエストのタイムスタンプの間に関係があるので、特定のリクエストの前後にどのリクエストが行われたかを知る必要がある場合、 Chain-ID
とタイムスタンプをフィルターとして使用してデータベースを検索するだけです。
from Django.db import models
from Django.contrib.sessions.models import Session
class Request(models.Model):
session = models.ForeignKey(Session)
chain_id = models.Charfield(max_length=100)
request_id = models.WhatEverField...
request_url = models.URLField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
役に立てば幸いです。
これが役立つかどうかはわかりませんが、リクエストIDに関しては、onclickイベントリスナー内に追加のヘッダーを設定するなど、Ajaxが役立つと思います。ずっといい ...