我在其中一个控制器中有一个Spring应用程序,我收到了HttpServletRequest
的对象。然后我必须将这个对象的一些头信息记录到一个数据库中,为此我开始一个线程。然后我将此HttpServletRequest
对象传递给线程,并尝试通过request.getHeader(HttpHeaders.USER_AGENT)
等方法访问字段。这运行正常,但是当我在此访问之前调试并放置断点时,我在所有这些标头中都得到空值。此外,每当线程延迟运行时,标头值将变为null。一种可能的解释是,经过一段时间后,容器释放内存。但为什么以及如何?这有时间限制吗?
答案 0 :(得分:3)
HttpServletRequest
和HttpServletResponse
类的实例不得在servlet服务方法之外使用。 Servlet容器可以(并且确实)在调用servlet方法时重用相同的请求/响应对象,方法是更改这些对象的内部状态以对应当前的http请求。
如果您有后台任务生成响应,那么您需要查看async servlet processing。
如果您的后台任务只需要请求中的某些数据,但会立即生成响应,那么您需要将请求中所需的所有信息复制到其他对象中,并将该对象传递给后台任务。 / p>