如何在Jetty过滤器中快速删除请求?

时间:2018-03-23 18:01:50

标签: java jetty embedded-jetty

我已经编写了一个Jetty过滤器来检测和删除用户发出的请求,这些请求通过大量请求向端点发送垃圾邮件,从而有效地为其他用户提供服务。一旦我发现它是一个坏演员,我真的想做的就是尽可能少地处理请求。到目前为止,我提出的最好的事情是:

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 个答案:

答案 0 :(得分:2)

如果使用Jetty,您可以使用特殊的非标准电话......

response.sendError(-1);

这实际上是javax.servlet.http.HttpServletResponse.sendError(int),其特殊的“错误状态代码”为-1

重要提示:上述内容不符合Servlet规范,不适用于Jetty。

这将中止Http频道并关闭连接而不发送响应。

请注意,由于Servlet层的展开,您可能会在服务器日志中看到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();
}