【问题标题】:What is a life of HttpServletRequest object?HttpServletRequest 对象的生命周期是什么?
【发布时间】:2014-11-20 02:25:49
【问题描述】:

我对@9​​87654321@ 生命物体有疑问。 request 对象进入controller 后是否被销毁?

【问题讨论】:

    标签: java servlets request


    【解决方案1】:

    HttpServletRequest 对象的生命周期就是:服务 HTTP Servlet 请求的时间。

    它可以在调用 servlet 的doGet()doPost() 等方法之前创建,之后可能立即被销毁。仅在服务请求期间使用它才有效。

    注意:然而 Servlet 容器可能为多个请求重用 HttpServletRequest 对象(通常是这种情况),但它们将被“清理”或重置,因此请求之间不会泄漏任何对象(如参数或属性)。这仅仅是由于性能问题:重置HttpServletRequest 对象比丢弃现有对象并创建新对象要快得多且成本更低。

    在一个典型的 Servlet 容器实现中,如果一个 HTTP 请求进来,当请求的 HTTP 输入数据被 Servlet 容器解析时,就会创建一个HttpServletRequest。整个请求可能会被延迟初始化(例如,参数可能只有在真正被访问时才被解析和填充,例如通过getParameter() 方法)。然后这个HttpServletRequest(扩展ServletRequest)通过Servlet过滤器,然后传递给Servlet.service(),它将基于HTTP方法(GETPOSTPUT 等)。然后请求将仍然有效,直到请求-响应对在整个过滤器链中循环返回。然后它将被销毁或重置(在用于另一个 HTTP 请求之前)。

    【讨论】:

    • 如果有人将 HttpServletRequest 对象传递到其他地方,那么 HttpServletRequest 对象将超出请求周期。你怎么看?
    • 是的,你可以这样做,但是在请求周期之外使用请求对象是无效的。所以强烈不推荐。
    • @icza 你不知道你现在帮了我多少——我们有一个问题很长一段时间了,HttpServletRequest 是通过 spring 的@Async 传递的,在某些时候它是字段在哪里被清除。您的输入 - “但是 Servlet 容器可能会为多个请求重用 HttpServletRequest 对象(通常是这种情况),但它们将被“清理”或重置,因此请求之间不会泄漏任何对象(如参数或属性)”是 绝对正确!。谢谢!
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多