Tomcat 不会在每个客户端请求上创建新的请求实例

问题描述 投票:0回答:1

我了解到,当来自客户端的请求时,Tomcat 会为每个请求生成一个新的请求实例。

所以我打印出 HttpServletRequest 的哈希码,但它总是相同的

这是我的代码,

package hello.servlet.basic.request;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebServlet(name = "tomcatCreateNewRequestInstance", value = "/check-request-address")
public class TomcatCreateNewRequestInstance extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("req = {}", req);
        log.info("req class = {}", req.getClass());
    }
}

但是相同的哈希码是这样的:

2024-05-03 15:40:28.725  INFO 14920 --- [nio-9090-exec-6] h.s.b.r.TomcatCreateNewRequestInstance   : req = org.apache.catalina.connector.RequestFacade@1f8212ca
2024-05-03 15:40:28.725  INFO 14920 --- [nio-9090-exec-6] h.s.b.r.TomcatCreateNewRequestInstance   : req class = class org.apache.catalina.connector.RequestFacade
2024-05-03 15:40:37.232  INFO 14920 --- [nio-9090-exec-4] h.s.b.r.TomcatCreateNewRequestInstance   : req = org.apache.catalina.connector.RequestFacade@1f8212ca
2024-05-03 15:40:37.232  INFO 14920 --- [nio-9090-exec-4] h.s.b.r.TomcatCreateNewRequestInstance   : req class = class org.apache.catalina.connector.RequestFacade
2024-05-03 15:40:37.370  INFO 14920 --- [nio-9090-exec-7] h.s.b.r.TomcatCreateNewRequestInstance   : req = org.apache.catalina.connector.RequestFacade@1f8212ca
2024-05-03 15:40:37.370  INFO 14920 --- [nio-9090-exec-7] h.s.b.r.TomcatCreateNewRequestInstance   : req class = class org.apache.catalina.connector.RequestFacade
2024-05-03 15:40:42.507  INFO 14920 --- [nio-9090-exec-9] h.s.b.r.TomcatCreateNewRequestInstance   : req = org.apache.catalina.connector.RequestFacade@1f8212ca
2024-05-03 15:40:42.507  INFO 14920 --- [nio-9090-exec-9] h.s.b.r.TomcatCreateNewRequestInstance   : req class = class org.apache.catalina.connector.RequestFacade
2024-05-03 15:40:42.695  INFO 14920 --- [nio-9090-exec-8] h.s.b.r.TomcatCreateNewRequestInstance   : req = org.apache.catalina.connector.RequestFacade@1f8212ca
2024-05-03 15:40:42.695  INFO 14920 --- [nio-9090-exec-8] h.s.b.r.TomcatCreateNewRequestInstance   : req class = class org.apache.catalina.connector.RequestFacade

我是不是听错了?还是Tomcat进行了一系列的优化?如果可以的话哪里可以找到相关参考资料?

java tomcat servlets
1个回答
0
投票

这些对象被“回收” - 但每个请求都会提供正确的数据。

这里没有什么可看的,并且您持有请求对象的时间不应超过请求被处理的时间。

您可能会在 servlet 规范中找到参考:容器(tomcat)如何处理请求取决于它。它拥有这些对象的生命周期,并且可以在处理请求后自由地使它们无效 - 即使该对象没有被回收,也不能保证它们具有处理请求时它们曾经具有的正确状态.

如果这对您的程序产生影响,那么您就做错了。您一定不关心请求的身份 - 只需根据其状态进行操作,并且保留请求或响应对象的时间不要超过请求处理的时间。

© www.soinside.com 2019 - 2024. All rights reserved.