/ / Jettyフィルタにリクエストをすばやくドロップする方法を教えてください。 - java、桟橋、埋め込み桟橋

Jettyフィルタにリクエストをすばやくドロップする方法を教えてください。 - java、桟橋、埋め込み桟橋

検出してドロップするためのJettyフィルタを作成しました大量の要求でエンドポイントをスパムしているユーザーからの要求、事実上他のユーザーへのDOS攻撃。悪意のある行為者であることが判明したら、できる限り少ない処理ですぐにリクエストを削除することです。私がこれまで考え出した中で最高のものはこれです:

HttpServletResponse response = (HttpServletResponse) servletResponse;
if (spamRequest()) {
response.reset();
response.setStatus(HttpStatus.TOO_MANY_REQUESTS_429);
response.flushBuffer();
}

私はそれで応えるべきだと思います 429 Too Many Requests そして体なし。 しかし、これは大量の要求であり、私は本当にすべての処理を短絡して接続を切断したいだけです。例外をスローすると、Jettyはデフォルトのhtml応答を含む500を返すようになります。これは、私の現在の解決策よりも優れていません。

回答:

回答№1は2

Jettyを使用している場合は、特別な非標準の通話を使用できます。

response.sendError(-1);

これは本質的に javax.servlet.http.HttpServletResponse.sendError(int) 特別な「エラーステータスコード」 -1.

重要:上記はサーブレット仕様に準拠していないため、Jetty以外では機能しません。

それはHTTPチャネルを中止し、応答を送信せずに接続を閉じます。

サーブレットレイヤの巻き戻しにより、サーバログにIOExceptionが記録されることがあります。

もしあなたが RequestLog これらの反応は奇妙に見えるかもしれないので、少なくともすることを忘れないでください response.setStatus(HttpStatus.TOO_MANY_REQUESTS_429) あなたが電話する前に sendError(-1) 生成されたリクエストログでキーオフするのに意味のある何かを取得するため。

あるいは、この動作が気に入らない場合は、必ず Connection: close 有効な応答を送信する前に、応答後にサーバーに接続を強制的に終了させます。

例えば:

if (spamRequest()) {
response.reset();
response.setHeader("Connection", "close");
response.setStatus(HttpStatus.TOO_MANY_REQUESTS_429);
response.flushBuffer();
}