我了解到,当来自客户端的请求时,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进行了一系列的优化?如果可以的话哪里可以找到相关参考资料?
这些对象被“回收” - 但每个请求都会提供正确的数据。
这里没有什么可看的,并且您持有请求对象的时间不应超过请求被处理的时间。
您可能会在 servlet 规范中找到参考:容器(tomcat)如何处理请求取决于它。它拥有这些对象的生命周期,并且可以在处理请求后自由地使它们无效 - 即使该对象没有被回收,也不能保证它们具有处理请求时它们曾经具有的正确状态.
如果这对您的程序产生影响,那么您就做错了。您一定不关心请求的身份 - 只需根据其状态进行操作,并且保留请求或响应对象的时间不要超过请求处理的时间。