我得到了这个servlet,它将pdf文件返回给客户端Web浏览器.我们不想冒任何风险,当请求数量过多时,服务器就会瘫痪.
我们希望以应用程序级别(程序)方式设置并发请求数量的限制,并在达到限制时向浏览器返回错误消息.我们需要在应用程序级别执行它,因为我们在开发级别(tomcat)和生产级别(websphere)中有不同的servlet容器.
我必须强调,我想控制最大请求数而不是会话数.用户可以使用相同的会话通过服务器发送多个请求.
任何的想法?我曾考虑使用静态计数器来跟踪请求的数量,但这会引发竞争条件的问题.
Whi*_*g34 19
我建议写一个简单的servlet Filter.在您的配置中web.xml应用于您希望限制并发请求数的路径.代码看起来像这样:
public class LimitFilter implements Filter {
private int limit = 5;
private int count;
private Object lock = new Object();
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
boolean ok;
synchronized (lock) {
ok = count++ < limit;
}
if (ok) {
// let the request through and process as usual
chain.doFilter(request, response);
} else {
// handle limit case, e.g. return status code 429 (Too Many Requests)
// see http://tools.ietf.org/html/rfc6585#page-3
}
} finally {
synchronized (lock) {
count--;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者你可以把这个逻辑放进你的HttpServlet.它只是更清洁,更可重复使用Filter.您可能希望通过web.xml而不是对其进行硬编码来配置限制.
参考:
检查HTTP状态代码429的定义.
| 归档时间: |
|
| 查看次数: |
16618 次 |
| 最近记录: |