【问题标题】: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

标签: servlets request


【解决方案1】:

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

【讨论】:

  • 别忘了应用服务器进入游戏,它负责包装所有传入的请求,这是你看到不同对象的原因,但里面有相同的内容,为什么添加一些标志应用服务器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2018-06-05
  • 2016-09-23
相关资源
最近更新 更多