Spring 检测客户端是否断开连接
Spring detect if client disconnect
这是当前架构,我正在使用
(upload file) (WebClient RestAPI) (Rest API)
Browser --------------> HAProxy ----> Nginx -----> Spring WebFlux ---> Spring MVC
如果浏览器因
而断开连接,我想发送请求以从服务器的 Redis 中删除缓存
- 客户端电脑关机
- xhr 流产(AJAX,等)
- 浏览器的选项卡已关闭
- 失去互联网连接
- 从技术上讲,我是否可以在服务器检测到浏览器断开连接后发送请求以删除服务器中的某些缓存?如下
eventClientDisconnect () {
// remove some cache from Redis
http.send('DELETE', 'http://localhost/user/1')
}
- 如果浏览器断开连接,我应该触发哪个层?
HAProxy, Nginx, WebFlux, or MVC
?
谢谢。
如果这些问题不合适,我提前道歉。
我找到了解决方案。
我可以在 Webflux
或 MVC servlet
中处理它。
I.MVC 可以检测到 Servlet(当请求完成时)
- 客户端关闭浏览器或标签页
- 客户端电脑关机
- AJAX流产
- 客户端通过关闭 WiFi 断开连接
@Bean
public Filter loggingFilter(){
AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() {
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
System.out.println("beforeRequest: " +message);
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
// Client closes browser or tab
// Client PC's shutdown
// AJAX abortion
// Client disconnect by switching off the WiFi
}
};
return f;
}
For any more details
II.Webflux只能检测到
- 客户端关闭浏览器或标签页
- 客户端电脑关机
- AJAX流产
你用doFinally { ... }
事件来处理上面的问题就够了。
但是如果您希望通过关闭 WiFi 来处理客户端断开连接。
您可能需要使用 WebSocket
依赖项。
这段代码可能在 Servlet 而不是 Webflux 中工作,但我不确定,所以你可以试试。
服务器
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-websocket'
}
public class GreetingHandler extends TextWebSocketHandler {
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
// Detected client disconnect here....
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
// Detected client connect here....
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
session.sendMessage(message);
}
@Configuration
@EnableWebSocket
public class RawWebSocketConfiguration {
@Bean
public WebSocketConfigurer webSocketConfigurer() {
return new WebSocketConfigurer() {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new GreetingHandler(), "/greeting").setAllowedOrigins("http://localhost:7010");
}
};
}
}
客户端 JS (http://localhost:7010)
const socket = new WebSocket("ws://localhost:7000/greeting");
这是当前架构,我正在使用
(upload file) (WebClient RestAPI) (Rest API)
Browser --------------> HAProxy ----> Nginx -----> Spring WebFlux ---> Spring MVC
如果浏览器因
而断开连接,我想发送请求以从服务器的 Redis 中删除缓存- 客户端电脑关机
- xhr 流产(AJAX,等)
- 浏览器的选项卡已关闭
- 失去互联网连接
- 从技术上讲,我是否可以在服务器检测到浏览器断开连接后发送请求以删除服务器中的某些缓存?如下
eventClientDisconnect () {
// remove some cache from Redis
http.send('DELETE', 'http://localhost/user/1')
}
- 如果浏览器断开连接,我应该触发哪个层?
HAProxy, Nginx, WebFlux, or MVC
?
谢谢。
如果这些问题不合适,我提前道歉。
我找到了解决方案。
我可以在 Webflux
或 MVC servlet
中处理它。
I.MVC 可以检测到 Servlet(当请求完成时)
- 客户端关闭浏览器或标签页
- 客户端电脑关机
- AJAX流产
- 客户端通过关闭 WiFi 断开连接
@Bean
public Filter loggingFilter(){
AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() {
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
System.out.println("beforeRequest: " +message);
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
// Client closes browser or tab
// Client PC's shutdown
// AJAX abortion
// Client disconnect by switching off the WiFi
}
};
return f;
}
For any more details
II.Webflux只能检测到
- 客户端关闭浏览器或标签页
- 客户端电脑关机
- AJAX流产
你用doFinally { ... }
事件来处理上面的问题就够了。
但是如果您希望通过关闭 WiFi 来处理客户端断开连接。
您可能需要使用 WebSocket
依赖项。
这段代码可能在 Servlet 而不是 Webflux 中工作,但我不确定,所以你可以试试。
服务器
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-websocket'
}
public class GreetingHandler extends TextWebSocketHandler {
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
// Detected client disconnect here....
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
// Detected client connect here....
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
session.sendMessage(message);
}
@Configuration
@EnableWebSocket
public class RawWebSocketConfiguration {
@Bean
public WebSocketConfigurer webSocketConfigurer() {
return new WebSocketConfigurer() {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new GreetingHandler(), "/greeting").setAllowedOrigins("http://localhost:7010");
}
};
}
}
客户端 JS (http://localhost:7010)
const socket = new WebSocket("ws://localhost:7000/greeting");