当前位置: 首页 > 面试题库 >

如何在servlet中设置并发请求数限制?

伍捷
2023-03-14
问题内容

我得到了这个servlet,它将pdf文件返回到客户端Web浏览器。我们不希望冒任何风险,即当请求数量过多时,服务器将瘫痪。

我们希望采用一种应用程序级别(程序)的方式来设置并发请求数的限制,并在达到限制时向浏览器返回错误消息。我们需要在审批级别进行操作,因为我们在开发级别(tomcat)和生产级别(websphere)具有不同的servlet容器。

我必须强调,我想控制最大请求数,而不是会话数。用户可以通过具有相同会话的服务器发送多个请求。

任何想法?我已经考虑过使用静态计数器来跟踪请求的数量,但是这会引发竞争状况的问题。


问题答案:

我建议写一个简单的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--;
            }           
        }
    }
}

或者,您也可以将此逻辑放入您的HttpServlet。它只是更干净,更可重用Filter。您可能希望通过web.xml而不是硬编码来配置限制。

参考:
检查HTTP状态代码429的定义。



 类似资料:
  • 问题内容: 我正在尝试检索JSP页面中servlet设置的属性值,但是我对参数by的运气还不错。我不确定该怎么做。也许它很简单,但是我还无法处理。 在JSP中,我一直试图检索“ attribValue”,但是没有成功: 如果我在所有过程(调用页面,servlet和目标页面)中都传递了一个参数,则它的效果很好。 问题答案: 它已经在默认的EL范围内可用,因此 应该做。 如果您想明确指定范围(EL将依

  • 我有两个URL,第一个是BaseURL创建用户,第二个是用来为asLongAs循环中的每个用户设置密码。我在第二个url请求中设置“计数器”时遇到问题,即“更改密码”。它在错误下面抛出, 9425[GatlingSystem-akka.actor.default-调度-11]ERRORi.g.http.action.HttpRequest estAction-'httpRequest-4'执行失败

  • 主要内容:请求转发,request 域对象,示例Web 应用在处理客户端的请求时,经常需要多个 Web 资源共同协作才能生成响应结果。但由于 Serlvet 对象无法直接调用其他 Servlet 的 service() 方法,所以 Servlet 规范提供了 2 种解决方案: 请求转发 请求包含(了解即可) 下面我们主要对请求转发进行介绍。 请求转发 请求转发属于服务器行为。容器接收请求后,Servlet 会先对请求做一些预处理,然后将请求传递

  • 问题内容: 我的Java Web应用程序有问题。 这是index.jsp中的代码: 当我有线请求时,我的浏览器发送以下标头: Tomcat服务器返回以下信息: 但是,如果我以我的形式发送“é”(UTF-8中的%C3%A9),则会显示“é”。 我了解的是浏览器发送了一个用UTF-8(%C3%A9)编码的“é”。 但是服务器将其解释为ISO-8859-1。因此,%C3解码为Ã,%A9解码为©,然后发

  • 问题内容: 我有两个Web应用程序,分别是web1和web2。我想将请求从web1 / servlet1转发到web2 / servlet2。可能吗?请帮忙! 问题答案: 这是一个两步过程: 掌握代表 获得从对应 因此,从内部开始是这样的: 所有这些都有一个很大的警告- 容器可能未配置为允许跨上下文转发,因为这存在潜在的安全风险。如果是这种情况,将返回。

  • 问题内容: 我在Go中做一个简单的http GET: 但是我找不到在doc中自定义请求标头的方法,谢谢 问题答案: 请求的字段是公共的。您可以这样做: