在Spring Boot中,你可以使用`javax.servlet.http.HttpServletResponse`对象来实现服务器端的异步消息推送。这通常通过设置一个`ServletOutputStream`和`BufferedOutputStream`,然后在后台线程中不断地写入数据来实现。以下是一个简单的示例: 1. 首先,你需要在Spring MVC控制器方法中处理AJAX请求: ```java import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.io.BufferedOutputStream; @Controller public class YourController { @GetMapping("/push") public void pushMessages(@RequestParam("messageId") Long messageId, HttpServletResponse response) throws IOException { // 获取OutputStream并设置为非阻塞模式 OutputStream outputStream = response.getOutputStream(); response.setContentType("text/event-stream"); response.setCharacterEncoding("UTF-8"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Connection", "keep-alive"); // 创建BufferedOutputStream BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); // 在后台线程中发送消息 new Thread(() -> { try { // 假设你有一个消息推送服务,这里只是示例 while (true) { String message = getNewMessage(messageId); // 获取新消息 if (message == null) { break; // 如果没有更多消息,关闭连接 } // 写入消息到输出流 bufferedOutputStream.write(("data: " + message + "\n\n").getBytes()); Thread.sleep(1000); // 每秒发送一次消息(根据需要调整) } // 关闭流 bufferedOutputStream.close(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } }).start(); } // 这里是获取新消息的逻辑,你可以替换为你自己的服务 private String getNewMessage(Long messageId) { // ... } } ``` 2. 客户端(使用jQuery)可以这样监听事件: ```javascript $(document).ready(function() { var socket = new EventSource('/push?messageId=your-message-id'); socket.addEventListener('message', function(event) { console.log('Received message:', event.data); // 在这里处理接收到的消息 }); socket.addEventListener('error', function(event) { if (event.readyState === EventSource.CLOSED) { console.error('Connection closed'); } }); }); ``` 注意:这个示例使用了`EventSource`,它是HTML5提供的用于服务器推送给浏览器事件的API。如果你需要兼容旧版本的浏览器,可能需要使用第三方库,如SSE.js。为了安全起见,你可能还需要处理跨域问题。 [2024-04-07 16:00:59 | AI写代码神器 | 581点数解答]