首页 > 解决方案 > Spring检测客户端是否断开连接

问题描述

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

        (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?

谢谢你。

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

标签: spring-mvcnginxspring-webfluxhaproxyspring-restcontroller

解决方案


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

更多详情

二、 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");

推荐阅读