我已经编写了一个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,这并不比我当前的解决方案好。
答案 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();
}