HTTP エラー コードの意図された目的に関しては403 Forbidden
、ページが存在する (404 が出ている) ため、間違いなく使用しますが、ユーザーは今のところアクセスを禁止されています (この制限はリソースの競合によるものではありません)。 、同時変更と同様ですが、ユーザーのアカウントの状態により、つまり、私の意見では 409 もアウトです)。意図された目的に基づく別の賢明なオプションは 401 であった可能性がありますが、nalply が彼のコメントで既に述べたように、このコードは、すべてではないにしても一部のブラウザにログイン ダイアログを表示させます。問題を解決します。したがって、ここでの選択肢は間違いありません。
403 の説明では 2 つの点が少し「不適切」に思われるので、それらについて説明します。
- Authorization will not help ...:これは、HTTP プロトコル内の承認メカニズムについてのみ説明しており、403 と 401 を区別することを目的としています。このステートメントは、カスタム承認またはセッション状態管理の形式には適用されません。
- ... リクエストは繰り返されるべきではありません ...:リクエストは常にセッション コンテキストで表示される必要があるため、ユーザーのセッション コンテキストが変更された (ユーザーが機能のロックを解除した) 場合、ユーザーは同じリソースへのアクセスを再試行します。つまり、つまり、この提案に違反するものではありません。
もちろん、独自のエラー コードを定義することもできますが、おそらく正式な方法で予約されることはないため、一部のブラウザー メーカーが意図的または誤ってそのコードを使用して特定のエラーをトリガーしないという保証はありません。 (デバッグ) アクション。可能性は低いですが、禁止されているわけではありません。
418でもOKです。:)
もちろん、機能の潜在的な利用可能性を具体的に覆い隠したい場合は、404 を使用することもできます。それが、せんさく好きなユーザーにヒントを与えない唯一の方法だからです。
さて、キャッシュの問題に:
これらのステータス コード (403、404、409、418) のいずれも、ブラウザーが他のどのコードよりもユーザーの意思に反してページをキャッシュするようにトリガーするべきではありません。問題は、多くのブラウザが狂ったようにすべてをキャッシュしようとするだけで、よりスムーズになることです。私の意見では、オペラはここで最悪です。私はこれらのことで何度も髪を引っ張ってきました。正しいヘッダー設定ですべてを解決できるはずですが、ブラウザ、サーバー、または中間プロキシのいずれかがそれらを無視してページを壊すことを決定した状況がありました。
私がこれまでに見つけた確実なリロードを確実に保証する唯一の方法は、/fields?t=29873 のようなダミーのリクエスト パラメータを追加することです。タイムスケール。もちろん、サーバーでは、このパラメーターを無視することができます。ユーザーが最初にページを開いたときに単純に 1 から開始し、次のリクエストをカウントアップするだけでは不十分であることに注意してください。
私は Java で Web 開発を行い (GWT を使用してサーバー側とクライアント側の両方で)、このコードを使用してダミーの「数字」を生成します。
private static final char[] base64chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.".toCharArray();
private static int tagIndex = 0;
/**
* Generates a unique 6-character tag string that is guaranteed to not repeat
* for about 400 days, if this function is, on average, not called more often
* than twice every millisecond.
*
* @return the tag string
*/
public static String nowTag() {
int tag = (int) ((System.currentTimeMillis() >>> 5)); // adjust
char[] result = new char[6];
result[5] = base64chars[(tagIndex++) & 63];
result[4] = base64chars[tag & 63];
tag >>>= 6;
result[3] = base64chars[tag & 63];
tag >>>= 6;
result[2] = base64chars[tag & 63];
tag >>>= 6;
result[1] = base64chars[tag & 63];
tag >>>= 6;
result[0] = base64chars[tag & 63];
return new String(result);
}
システムのクロックをカウンターと組み合わせて使用し、ミリ秒ごとに最大約 2 つの保証された一意の値を提供できるようにします。この速度は必要ないかもしれないので、>>> 5
必要に応じて「調整」とマークした を自由に変更してください。これを 1 増やすと、レートは 2 分の 1 になり、一意性の期間は 2 倍になります。したがって、たとえば、>>> 8
代わりに、4 ミリ秒ごとに約 1 つの値を生成でき、値は 3200 日間繰り返されません。もちろん、ユーザーがシステムクロックをいじると、値が繰り返されないというこの保証はなくなります。ただし、これらの値は連続して生成されるわけではないため、同じ数を 2 回ヒットすることはほとんどありません。このコードは、URL をできるだけ短くするために、10 進数ではなく 6 文字のテキスト文字列 (base64) を生成します。
お役に立てれば。:)