【问题标题】:Prevent response in controller防止控制器响应
【发布时间】:2019-11-08 10:57:56
【问题描述】:

我正在使用 spring boot 来模拟我们更复杂的服务之一。虽然所有标准案例都很容易完成,但有一个给我带来了一些麻烦。理论上,我正在模拟的应用程序有可能在不发送响应的情况下崩溃并关闭连接。

我在 Spring Boot 中尝试了几件事来实现这一点,而实际上我的模拟没有崩溃。这包括抛出进入异常处理程序并从那里没有正确响应的异常,但是到目前为止,要么已经通过 spring 生成错误响应,要么以某种方式解析为空响应。

是否可以选择在 @Conroller 中设置一个方法来导致关闭连接而没有任何响应?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    关闭连接是 HTTP 规范和协议的责任。您不能以编程方式强制执行它。 HTTP Client 和 HTTP Server 之间正在进行连接协商。

    虽然您可以尝试中断当前线程或设置标头Connection: close,但您不应该搞乱连接和请求处理的那部分。您的 HTTP 服务器可能会开始出现意外行为。

    尝试不同的方法。如果您需要模拟关闭的连接,您可以以编程方式分配一个新的 HTTP 服务器实例,向它发送请求,暂停请求处理并杀死一个实例是一个单独的线程。我相信你会找到更好的方法,只是从不同的角度找到问题的根源。

    【讨论】:

      【解决方案2】:

      你可以这样创建方法:

      @ResponseBody
      @RequestMapping("/your-url")
      public String test() {
          return null;
      }
      

      您也可以将@Controller 更改为@RestController 并删除@ResponseBody

      【讨论】:

      • 啊,我觉得我的标题让我的问题有点模棱两可。响应是指整个 HTTP 响应。理想情况下,客户端应该得到一个connection closed,而不会将任何内容发送给客户端。使用null 响应,它将获得一个有效的 200 OK 响应,其中只有 0 个内容。
      • 也许有些困难:尝试放入控制器:Thread.currentThread().interrupt();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2017-06-15
      • 2011-03-22
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多