为啥 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化?

Posted

技术标签:

【中文标题】为啥 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化?【英文标题】:Why HttpServletRequest object get changed when it is forwarded from one servlet to another?为什么 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化? 【发布时间】:2014-03-06 15:27:52 【问题描述】:

我正在编写一些简单的代码来将 HTTP 请求从一个 servlet 转发到另一个:

来自 Servlet1:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  
    ...
    System.out.println("In Servlet1:");
    System.out.println("request: " + request.hashCode() + ", " + request.toString());
    request.getRequestDispatcher("/servlet/Servlet2").forward(request, response);       

来自 Servlet2:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  
    ...
    System.out.println("In Servlet2:");
    System.out.println("request: " + request.hashCode() + ", " + request.toString());               

据我所知,“转发”方法只是请求 Web 服务器将相同的 HTTP 请求发送到另一个 servlet。所以Servlet1和Servlet2中的2个请求对象应该是一样的。但是,我得到了以下结果:

In Servelt1: 
request: 2106487657, org.apache.catalina.connector.RequestFacade@7d8e7369
In Servlet2:
request: 887057147, org.apache.catalina.core.ApplicationHttpRequest@34df6afb

请求对象好像变了?为什么?

我正在使用 Tomcat 7.0.50 中的 servlet-api

【问题讨论】:

不要使用<code>。将所有行缩进 4 个空格,或者通过选择代码并按下工具栏中的代码按钮自动缩进:。 感谢您的提示!我从 toString 结果中看到了原因。 ApplicationHttpRequest 是一个包装器,它包装了原来的 RequestFacade 【参考方案1】:

toString 结果揭示了一个事实:ApplicationHttpRequest 是一个包装器,它包装了原始的 RequestFacade

【讨论】:

别忘了应用服务器进入游戏,它负责包装所有传入的请求,这是你看到不同对象的原因,但里面有相同的内容,为什么添加一些标志应用服务器

以上是关于为啥 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制]

为啥我们要包装 HttpServletRequest ? api 提供了一个 HttpServletRequestWrapper 但我们从包装请求中获得了啥?

HttpServletRequest对象

HttpServletRequest对象

在 RESTful Web 服务中访问 HttpServletRequest 对象

JavaWeb---总结HttpServletRequest对象