为什么Spring Boot将相同的HttpServletResponse对象注入到我的Controller方法中以进行不同的请求?

时间:2018-07-05 02:36:41

标签: spring spring-boot

我想知道为什么spring boot为不同的请求将相同的响应对象注入到我的控制器方法参数中,我按如下方式使用它:

@Controller
@Slf4j
@Profile("default")
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/test")
    @ResponseBody
    public void getDeviceImage(@RequestParam("serialNumber") String serialNumber, HttpServletResponse response) {
        return balabala;
    }
}

我在返回命令之前添加了一个断点,并且发现响应对象的地址对于不同的请求是相同的。

我想写一些东西到response.getOutputStream(),我发现以前存在缓冲数据。

2 个答案:

答案 0 :(得分:0)

如果需要添加一些额外的元信息(例如Cookie等),则可以使用

HttpServletResponse。默认情况下,即使您未在参数中指定HttpServletResponse,在典型的MVC中,模型也会添加到传播到视图之前的新构造响应。

如果您只需要返回一些响应,例如模型或实体或简单的JSON,则不必手动弄乱HttpServletResponse。除非您想浏览Cookie或标题等。在您的代码中,如果您不需要关心这一点,则可能不需要它。

根据HttpServletResponse的API文档:

  

servlet容器创建一个HttpServletResponse对象并传递   它作为servlet服务方法(doGet,doPost,   等)。

您看到的可能是Spring设置的默认配置。

使用@ResponseBody,将返回类型直接写回响应。 https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

答案 1 :(得分:0)

最后,我发现Response将一直被重用,并且将为每个请求(org.apache.catalina.connector.Response#recycle)调用Response的回收方法。 但是默认情况下,facade&outputStream&writer不会被清除,因此在该问题消失之后,我将系统属性“ org.apache.catalina.connector.RECYCLE_FACADES”设置为“ true”。