当前位置: 首页 > 面试题库 >

Spring MVC中如何在动作之前发送响应

斜浩穰
2023-03-14
问题内容

假设我的弹簧控制器功能接收了大量数据。我要回200 OK,因为该数据是正确的结构化的, 之后 我想执行的处理,这可能需要一段时间。

据我了解,发送响应的唯一方法是通过 return 命令。但是我不想在响应发送时结束该功能。

功能中间是否还有其他方法可以将响应发送给客户端?

创建新的线程运行是显而易见的,但是其他语言(JS)使您可以更优雅地处理它。

@RequestMapping(value = Connectors.CONNECTOR_HEARTBEAT, method = RequestMethod.POST)
public ResponseEntity<String> doSomething(@RequestBody List<Message> messages) {
    HttpStatus code = (messages!=null && !messages.isEmpty()) ? HttpStatus.OK
            : HttpStatus.NOT_FOUND;
    return new ResponseEntity<String>(res, code);
   // how do I add code here??
}

问题答案:

您当然可以在发送响应后进行处理。更通用的方法是使用的afterCompletion方法HandlerInterceptor。通过构造,它将在将响应发送给客户端之后执行,但是它迫使您将逻辑分为两个部分:控制器中的
部分和拦截器中的 部分。

另一种方法是忘记Spring MVC机制,并在控制器中手动提交响应:

@RequestMapping(value = Connectors.CONNECTOR_HEARTBEAT, method = RequestMethod.POST)
public void doSomething(@RequestBody List<Message> messages, HttpServletResponse response) {
    int code = (messages!=null && !messages.isEmpty()) ? HttpServletResponse.SC_OK
            : HttpServletResponse.SC_NOT_FOUND;
    if (code != HttpServletResponse.SC_OK) {
        response.sendError(code, res);
        return;
    }
    java.io.PrintWriter wr = response.getWriter();
    response.setStatus(code);
    wr.print(res);
    wr.flush();
    wr.close();

    // Now it it time to do the long processing
    ...
}

注意void返回代码,以通知Spring响应已在控制器中提交。

作为一个附带好处,处理仍在同一线程中进行,因此您可以完全访问会话范围的属性或Spring MVC或Spring Security使用的任何其他线程局部html" target="_blank">变量。



 类似资料:
  • 在我的Spring Boot 2.2. x Web应用程序中,我需要拦截404错误,以便在呈现错误页面或返回带有错误信息的json之前执行一些自定义逻辑。 实现这一点的正确方法是什么? 目前,我正在尝试使用类,但我不知道使用(如果抛出了任何异常)处理哪个异常。。。 注意:我已经尝试拦截,但这似乎不起作用...(未触发处理程序)。 我还在<code>应用程序中启用了此功能。属性: 还有其他建议吗?

  • 我有一个需求,我从ESB api获得请求,并通过restfull tomcatendpoint使用ESB排序,我验证请求,然后将其发送到JMS队列, 这很好,但如果在restfull tomcatendpoint中验证失败,我还希望将响应发送给发送者。由于验证失败,消息不会被传递到队列,而是被丢弃到队列中。 有可能吗? 请提示,如果消息到达队列或在esb序列中的tomcatendpoint被丢弃,

  • 我正在创建REST API(Symfony 4,FOS REST捆绑包),为了测试,我正在使用Postman应用程序。问题是,在登录请求时,我获得了JWT令牌,之后,在每个其他请求中,我都必须将其作为授权标头的一部分作为承载令牌传递回去。由于每次登录时该令牌都会发生变化,因此每次登录后(当令牌过期时),我都必须手动复制/粘贴令牌值。 这能以某种方式避免并自动完成吗?

  • 问题内容: 我正在编辑内置的表单。 我在对话框中显示该表单,然后提交。 数据已正确输入数据库。 但是我不知道是否需要将一些寄回。其实我对事情有点困惑。 假设我在表中使用``jQuery添加了一行,当我提交表单时,然后在提交数据之后,我想发回那些行数据,以便我可以动态添加表行以显示添加的数据。 我很困惑如何获取这些数据。 这是我当前的代码: 这只是带有成功消息的模板。 问题答案: Symfony 2

  • 我们正在从JBoss4.x迁移到5.1,字符编码出现了问题。 我尝试过,但没有成功: 在jboss/bin/run.bat中,设置set“java_opts=-dfile.encoding=utf-8%java_opts%” 在jboss/server//deploy/jbossweb.sar/server.xml设置中

  • 我是 SSE(服务器发送事件)的新手。我找到了一种在Spring启动中使用SSE发送响应的方法。我能够每 20 秒发送一次响应。我用下面的代码做同样的事情。 但问题是,这个方法每20秒就被调用一次。 但是,我的要求是每20秒向客户端发送一次空响应,并在新用户添加到数据库时发送响应。 如何实现我的目标?或者我在概念上完全错了。

  • 我正在尝试编写一个将图像转换为PDF文件的web应用程序。用户发送两幅图像(JPEG、PNG),并应接收和下载PDF文件。 目前的主要问题是我不知道如何将PDF文件返回给客户端。 这是我的控制器: 这是将图像转换为PDF文件的服务(这里我使用库): 另外,当生成文件以从存储中下载文件时,可以将PDF文件存储在某个位置,并在客户端创建“下载”按钮?

  • 问题内容: 从Node.js服务器向浏览器发送脚本时,在Google Chrome浏览器中,出现以下警告: 资源被解释为脚本,但以MIME类型文本/纯文本传输 我用Google搜索了一下,发现这是服务器端的问题,也就是说,我认为在发送事物之前,我应该为事物设置正确的MIME类型。这是HTTP服务器的处理程序: 问题: 如何更正服务器端代码以正确配置MIME类型? (注意:我已经找到https://