Spring 检测客户端是否断开连接

Spring detect if client disconnect

这是当前架构,我正在使用

        (upload file)                          (WebClient RestAPI)    (Rest API)
Browser --------------> HAProxy ----> Nginx -----> Spring WebFlux ---> Spring MVC

如果浏览器因

而断开连接,我想发送请求以从服务器的 Redis 中删除缓存
  1. 从技术上讲,我是否可以在服务器检测到浏览器断开连接后发送请求以删除服务器中的某些缓存?如下
   eventClientDisconnect () {
       // remove some cache from Redis
       http.send('DELETE', 'http://localhost/user/1')
   }
  1. 如果浏览器断开连接,我应该触发哪个层?
    HAProxy, Nginx, WebFlux, or MVC?

谢谢。

如果这些问题不合适,我提前道歉。

我找到了解决方案。
我可以在 WebfluxMVC 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");