サーブレットへのリクエストを拒否したり、応答しないことは可能ですか? 同じスレッドで 100 ミリ秒以内に 2 つのリクエストを受信した場合、2 つ目のリクエストを完全に無視できますか? または、最初のリクエストを中止して 2 番目のリクエストのみを処理することは可能ですか?
1 に答える
0
後続のリクエストを拒否するには、最初のリクエストの期間内のすべてのリクエストについて、処理する意思のある最初のリクエストの時間を記録する必要があります(悪いレスポンスを返す、レスポンスを返さないなど)。例えば:
private static final Object LOCK_OBJECT = new Object();
private static long lastAokTime;
private static final long MIN_REQUEST_TIME_MILLIS = 100L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
synchronized(LOCK_OBJECT) {
final long now = System.currentTimeMillis();
if (lastAokTime == 0 || (now - lastAokTime < MIN_REQUEST_TIME_MILLIS)) {
// reject the request
response.setStatus(500); // perhaps?
return;
} else {
lastAokTime = now;
}
// carry on and process request
}
}
スレッド化は興味深いものですが、スレッドごとに本当に必要ですか、それともグローバル プロパティとして必要ですか (アプリケーション サーバーは、バックグラウンドでかなりのスレッド処理を行って支援します)。上記のサンプルはグローバルですが、スレッドにロックする場合は、LOCK_OBJECT を ThreadLocal オブジェクトに置き換えることができます。
幸運を。
于 2012-09-11T05:24:25.437 に答える