Spring boot集成WebSocket 出现404问题,访问不到,Initializing Spring DispatcherServlet ‘dispatcherServlet‘

spring boot集成WebSocket后发现咋都请求不到,日志输出只有一行

Initializing Spring DispatcherServlet 'dispatcherServlet'

把项目的日志等级改成了trace 级别后,日志输出如下

2024-11-14 15:13:35,862 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] INFO  o.a.c.c.C.[.[.[/light_show] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-11-14 15:13:35,869 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] INFO  o.s.w.s.DispatcherServlet - [initServletBean,525] - Initializing Servlet 'dispatcherServlet'
2024-11-14 15:13:35,870 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'multipartResolver'
2024-11-14 15:13:35,871 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [initMultipartResolver,519] - Detected org.springframework.web.multipart.support.StandardServletMultipartResolver@1f233bc0
2024-11-14 15:13:35,871 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'localeResolver'
2024-11-14 15:13:35,871 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [initLocaleResolver,543] - Detected org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@7ea9059c
2024-11-14 15:13:35,871 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'themeResolver'
2024-11-14 15:13:35,872 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [initThemeResolver,568] - Detected org.springframework.web.servlet.theme.FixedThemeResolver@3a9a1550
2024-11-14 15:13:35,878 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'webSocketHandlerMapping'
2024-11-14 15:13:35,878 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'welcomePageHandlerMapping'
2024-11-14 15:13:35,879 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'requestMappingHandlerMapping'
2024-11-14 15:13:35,879 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'viewControllerHandlerMapping'
2024-11-14 15:13:35,879 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'beanNameHandlerMapping'
2024-11-14 15:13:35,879 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'routerFunctionMapping'
2024-11-14 15:13:35,879 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'resourceHandlerMapping'
2024-11-14 15:13:35,879 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'defaultServletHandlerMapping'
2024-11-14 15:13:35,880 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'requestMappingHandlerAdapter'
2024-11-14 15:13:35,880 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'handlerFunctionAdapter'
2024-11-14 15:13:35,880 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'httpRequestHandlerAdapter'
2024-11-14 15:13:35,880 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'simpleControllerHandlerAdapter'
2024-11-14 15:13:35,883 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'errorAttributes'
2024-11-14 15:13:35,883 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'handlerExceptionResolver'
2024-11-14 15:13:35,883 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'viewNameTranslator'
2024-11-14 15:13:35,883 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [initRequestToViewNameTranslator,718] - Detected DefaultRequestToViewNameTranslator
2024-11-14 15:13:35,883 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'beanNameViewResolver'
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'mvcViewResolver'
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'defaultViewResolver'
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'viewResolver'
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'flashMapManager'
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [initFlashMapManager,782] - Detected SessionFlashMapManager
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.w.s.DispatcherServlet - [initServletBean,542] - enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2024-11-14 15:13:35,884 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] INFO  o.s.w.s.DispatcherServlet - [initServletBean,547] - Completed initialization in 15 ms
2024-11-14 15:13:35,892 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.d.r.c.RedisConnectionUtils - [doGetConnection,143] - Fetching Redis Connection from RedisConnectionFactory
2024-11-14 15:13:35,910 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.d.r.c.RedisConnectionUtils - [doCloseConnection,389] - Closing Redis Connection.
2024-11-14 15:13:35,914 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.w.s.f.OrderedRequestContextFilter - [initContextHolders,115] - Bound request context to thread: org.apache.catalina.connector.RequestFacade@4869c438
2024-11-14 15:13:35,915 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'springSecurityFilterChain'
2024-11-14 15:13:35,922 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [getFilters,233] - Trying to match request against DefaultSecurityFilterChain [RequestMatcher=any request, Filters=[org.springframework.security.web.session.DisableEncodeUrlFilter@7e0d15b3, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@1637d945, org.springframework.security.web.context.SecurityContextPersistenceFilter@200a935e, org.springframework.security.web.header.HeaderWriterFilter@6b1488ab, org.springframework.web.filter.CorsFilter@1b3d9cf9, org.springframework.security.web.authentication.logout.LogoutFilter@1349e908, org.springframework.web.filter.CorsFilter@1b3d9cf9, com.light.framework.security.filter.JwtAuthenticationTokenFilter@1460bdbd, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@2cd8193, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3f918450, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6d594fcd, org.springframework.security.web.session.SessionManagementFilter@4974ecb3, org.springframework.security.web.access.ExceptionTranslationFilter@74ba9852, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@65dd5073]] (1/1)
2024-11-14 15:13:35,925 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.FilterChainProxy - [doFilterInternal,218] - Securing GET /api/websocket/1?sid=1
2024-11-14 15:13:35,926 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking DisableEncodeUrlFilter (1/14)
2024-11-14 15:13:35,926 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking WebAsyncManagerIntegrationFilter (2/14)
2024-11-14 15:13:35,930 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking SecurityContextPersistenceFilter (3/14)
2024-11-14 15:13:35,932 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - [doFilter,104] - Set SecurityContextHolder to empty SecurityContext
2024-11-14 15:13:35,933 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking HeaderWriterFilter (4/14)
2024-11-14 15:13:35,934 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking CorsFilter (5/14)
2024-11-14 15:13:35,939 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking LogoutFilter (6/14)
2024-11-14 15:13:35,939 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.l.LogoutFilter - [requiresLogout,117] - Did not match request to Or [Ant [pattern='/logout', GET], Ant [pattern='/logout', POST], Ant [pattern='/logout', PUT], Ant [pattern='/logout', DELETE]]
2024-11-14 15:13:35,939 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking CorsFilter (7/14)
2024-11-14 15:13:35,939 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking JwtAuthenticationTokenFilter (8/14)
2024-11-14 15:13:35,941 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking RequestCacheAwareFilter (9/14)
2024-11-14 15:13:35,942 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking SecurityContextHolderAwareRequestFilter (10/14)
2024-11-14 15:13:35,943 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking AnonymousAuthenticationFilter (11/14)
2024-11-14 15:13:35,944 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.AnonymousAuthenticationFilter - [doFilter,96] - Set SecurityContextHolder to AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=127.0.0.1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]]
2024-11-14 15:13:35,944 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking SessionManagementFilter (12/14)
2024-11-14 15:13:35,945 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking ExceptionTranslationFilter (13/14)
2024-11-14 15:13:35,945 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking FilterSecurityInterceptor (14/14)
2024-11-14 15:13:35,946 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/login'] - [permitAll] (1/34)
2024-11-14 15:13:35,946 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/captchaImage'] - [permitAll] (2/34)
2024-11-14 15:13:35,946 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/common/**'] - [permitAll] (3/34)
2024-11-14 15:13:35,947 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/aliyun/check/videoCallback'] - [permitAll] (4/34)
2024-11-14 15:13:35,947 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/vehicleLogin/getTokenByOpenId'] - [permitAll] (5/34)
2024-11-14 15:13:35,947 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/vehicleLogin/getTokenByAccount'] - [permitAll] (6/34)
2024-11-14 15:13:35,947 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/vehicleLogin/getTokenByUserId'] - [permitAll] (7/34)
2024-11-14 15:13:35,948 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/vehicleLogin/v2/**'] - [permitAll] (8/34)
2024-11-14 15:13:35,948 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/material_push/ota/**'] - [permitAll] (9/34)
2024-11-14 15:13:35,948 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/material_push/vehicle/**'] - [permitAll] (10/34)
2024-11-14 15:13:35,948 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/tripartite/noAuth/**'] - [permitAll] (11/34)
2024-11-14 15:13:35,948 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/zeekrCode/**'] - [permitAll] (12/34)
2024-11-14 15:13:35,948 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/zopLogin'] - [permitAll] (13/34)
2024-11-14 15:13:35,949 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/light/unityApp/**'] - [permitAll] (14/34)
2024-11-14 15:13:35,949 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - [getAttributes,89] - Did not match request to Ant [pattern='/zeekrWebsiteLogin'] - [permitAll] (15/34)
2024-11-14 15:13:35,949 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.i.FilterSecurityInterceptor - [authenticateIfRequired,311] - Did not re-authenticate AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=127.0.0.1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]] before authorizing
2024-11-14 15:13:35,950 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.i.FilterSecurityInterceptor - [beforeInvocation,205] - Authorizing filter invocation [GET /api/websocket/1?sid=1] with attributes [permitAll]
2024-11-14 15:13:35,963 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - [beforeInvocation,210] - Authorized filter invocation [GET /api/websocket/1?sid=1] with attributes [permitAll]
2024-11-14 15:13:35,963 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.i.FilterSecurityInterceptor - [beforeInvocation,230] - Did not switch RunAs authentication since RunAsManager returned null
2024-11-14 15:13:35,963 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.FilterChainProxy - [doFilter,333] - Secured GET /api/websocket/1?sid=1
2024-11-14 15:13:35,970 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [traceDebug,116] - GET "/light_show/api/websocket/1?sid=1", parameters={masked}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2024-11-14 15:13:35,991 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.h.SimpleUrlHandlerMapping - [getHandler,519] - Mapped to HandlerExecutionChain with [ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]]] and 5 interceptors
2024-11-14 15:13:35,998 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.w.s.r.ResourceHttpRequestHandler - [handleRequest,560] - Resource not found
2024-11-14 15:13:35,999 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.h.w.HstsHeaderWriter - [writeHeaders,152] - Not injecting HSTS header since it did not match request to [Is Secure]
2024-11-14 15:13:35,999 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [processDispatchResult,1157] - No view rendering, null ModelAndView returned.
2024-11-14 15:13:36,000 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.w.s.DispatcherServlet - [logResult,1131] - Completed 404 NOT_FOUND, headers={masked}
2024-11-14 15:13:36,004 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'springApplicationAdminRegistrar'
2024-11-14 15:13:36,004 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'refreshEventListener'
2024-11-14 15:13:36,005 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'delegatingApplicationListener'
2024-11-14 15:13:36,005 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'liveReloadServerEventListener'
2024-11-14 15:13:36,010 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - [doFilter,120] - Cleared SecurityContextHolder to complete request
2024-11-14 15:13:36,010 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.w.s.f.OrderedRequestContextFilter - [doFilterInternal,105] - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4869c438
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.w.s.f.OrderedRequestContextFilter - [initContextHolders,115] - Bound request context to thread: org.apache.catalina.core.ApplicationHttpRequest@dbc441b
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [getFilters,233] - Trying to match request against DefaultSecurityFilterChain [RequestMatcher=any request, Filters=[org.springframework.security.web.session.DisableEncodeUrlFilter@7e0d15b3, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@1637d945, org.springframework.security.web.context.SecurityContextPersistenceFilter@200a935e, org.springframework.security.web.header.HeaderWriterFilter@6b1488ab, org.springframework.web.filter.CorsFilter@1b3d9cf9, org.springframework.security.web.authentication.logout.LogoutFilter@1349e908, org.springframework.web.filter.CorsFilter@1b3d9cf9, com.light.framework.security.filter.JwtAuthenticationTokenFilter@1460bdbd, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@2cd8193, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3f918450, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6d594fcd, org.springframework.security.web.session.SessionManagementFilter@4974ecb3, org.springframework.security.web.access.ExceptionTranslationFilter@74ba9852, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@65dd5073]] (1/1)
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.FilterChainProxy - [doFilterInternal,218] - Securing GET /error?sid=1
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking DisableEncodeUrlFilter (1/14)
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking WebAsyncManagerIntegrationFilter (2/14)
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking SecurityContextPersistenceFilter (3/14)
2024-11-14 15:13:36,013 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - [doFilter,104] - Set SecurityContextHolder to empty SecurityContext
2024-11-14 15:13:36,014 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking HeaderWriterFilter (4/14)
2024-11-14 15:13:36,014 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking CorsFilter (5/14)
2024-11-14 15:13:36,014 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking LogoutFilter (6/14)
2024-11-14 15:13:36,014 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.l.LogoutFilter - [requiresLogout,117] - Did not match request to Or [Ant [pattern='/logout', GET], Ant [pattern='/logout', POST], Ant [pattern='/logout', PUT], Ant [pattern='/logout', DELETE]]
2024-11-14 15:13:36,014 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking CorsFilter (7/14)
2024-11-14 15:13:36,014 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking JwtAuthenticationTokenFilter (8/14)
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking RequestCacheAwareFilter (9/14)
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking SecurityContextHolderAwareRequestFilter (10/14)
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking AnonymousAuthenticationFilter (11/14)
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.a.AnonymousAuthenticationFilter - [doFilter,96] - Set SecurityContextHolder to AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=127.0.0.1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]]
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking SessionManagementFilter (12/14)
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking ExceptionTranslationFilter (13/14)
2024-11-14 15:13:36,015 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.s.w.FilterChainProxy - [doFilter,343] - Invoking FilterSecurityInterceptor (14/14)
2024-11-14 15:13:36,016 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.FilterChainProxy - [doFilter,333] - Secured GET /error?sid=1
2024-11-14 15:13:36,016 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [traceDebug,116] - "ERROR" dispatch for GET "/light_show/error?sid=1", parameters={masked}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2024-11-14 15:13:36,023 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.m.m.a.RequestMappingHandlerMapping - [lookupHandlerMethod,417] - 2 matching mappings: [{ [/error]}, { [/error], produces [text/html]}]
2024-11-14 15:13:36,024 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.f.s.DefaultListableBeanFactory - [doGetBean,264] - Returning cached instance of singleton bean 'basicErrorController'
2024-11-14 15:13:36,024 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.m.m.a.RequestMappingHandlerMapping - [getHandler,519] - Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2024-11-14 15:13:36,039 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.m.HandlerMethod - [invokeForRequest,148] - Arguments: [SecurityContextHolderAwareRequestWrapper[ FirewalledRequest[ org.apache.catalina.core.ApplicationHttpRequest@dbc441b]]]
2024-11-14 15:13:36,062 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.w.s.m.m.a.HttpEntityMethodProcessor - [writeWithMessageConverters,268] - Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]
2024-11-14 15:13:36,064 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.m.m.a.HttpEntityMethodProcessor - [traceDebug,116] - Writing [{timestamp=Thu Nov 14 15:13:36 CST 2024, status=404, error=Not Found, message=No message available, path=/light_show/api/websocket/1}]
2024-11-14 15:13:36,082 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.w.s.DispatcherServlet - [processDispatchResult,1157] - No view rendering, null ModelAndView returned.
2024-11-14 15:13:36,082 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.w.s.DispatcherServlet - [logResult,1127] - Exiting from "ERROR" dispatch, status 404, headers={masked}
2024-11-14 15:13:36,082 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - [doFilter,120] - Cleared SecurityContextHolder to complete request
2024-11-14 15:13:36,083 {yyyy-MM-dd} {HH:mm:ss.SSS} [http-nio-8080-exec-1] TRACE o.s.b.w.s.f.OrderedRequestContextFilter - [doFilterInternal,105] - Cleared thread-bound request context: org.apache.catalina.core.ApplicationHttpRequest@dbc441b
2024-11-14 15:13:40,843 {yyyy-MM-dd} {HH:mm:ss.SSS} [QuartzScheduler_LightShowScheduler-suixins-MacBook-Pro.local1731568391946_MisfireHandler] DEBUG o.s.s.q.LocalDataSourceJobStore - [manage,4010] - MisfireHandler: scanning for misfires...
2024-11-14 15:13:40,915 {yyyy-MM-dd} {HH:mm:ss.SSS} [QuartzScheduler_LightShowScheduler-suixins-MacBook-Pro.local1731568391946_MisfireHandler] DEBUG o.s.s.q.LocalDataSourceJobStore - [doRecoverMisfires,3259] - Found 0 triggers that missed their scheduled fire-time.

摘取关键代码就是404,找不到路径
解决方法如下
1、在WebSocketServer类中更改如下

@ServerEndpoint(value = "/api/websocket/{sid}",configurator = WebSocketConfig.class,encoders = WebSocketCustomEncoding.class)

新增了configurator = WebSocketConfig.class

2、然后在WebSocketConfig中新增

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

源码如下:
WebSocketConfig.java

@Configuration
@EnableWebSocket
public class WebSocketConfig extends ServerEndpointConfig.Configurator implements WebSocketConfigurer {

    /**
     * 注入拦截器
     */
    @Resource
    private WebSocketInterceptor webSocketInterceptor;


    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {

        webSocketHandlerRegistry
                //添加myHandler消息处理对象,和websocket访问地址
                .addHandler(myHandler(), "/aip/websocket")
                //设置允许跨域访问
                .setAllowedOrigins("*")
                //添加拦截器可实现用户链接前进行权限校验等操作
                .addInterceptors(webSocketInterceptor);
    }

    @Bean
    public WebSocketHandler myHandler() {
        return new MyWebSocketHandler();
    }

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

WebSocketInterceptor.java

@RefreshScope
@Component
public class WebSocketInterceptor implements HandshakeInterceptor {
    /**
     * 日志
     */
    private static final Logger log = LoggerFactory.getLogger(WebSocketInterceptor.class);

    @Resource
    private final RedisCache redisCache = SpringUtils.getBean(RedisCache.class);


    @Value("${token.expireTime}")
    private int expireTime;

    /**
     * 握手之前
     *
     * @param request    request
     * @param response   response
     * @param wsHandler  handler
     * @param attributes 属性
     * @return 是否握手成功:true-成功,false-失败
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                                   Map<String, Object> attributes) {
        ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
        //获取参数
        String uuid = serverHttpRequest.getServletRequest().getParameter(SocketConstants.SOCKET_KEY);
        Collection<String> keys = redisCache.keys(Constants.LOGIN_SOCKET_KEY + "*");
        if( keys.contains(Constants.LOGIN_SOCKET_KEY+uuid)){
            attributes.put(SocketConstants.SOCKET_KEY, uuid);
            log.info(MessageTemplate.socketExist,uuid);
            return true;
        }else {
            log.info(MessageTemplate.socketUnExist,uuid);
            return false;
        }
    }

    /**
     * 握手后
     *
     * @param request   request
     * @param response  response
     * @param wsHandler wsHandler
     * @param exception exception
     */
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                               Exception exception) {
        ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
        //获取参数
        String uuid = serverHttpRequest.getServletRequest().getParameter(SocketConstants.SOCKET_KEY);
        SocketConnect socketConnect = redisCache.getCacheObject(Constants.LOGIN_SOCKET_KEY + uuid);
        socketConnect.setLastConnectTime(new Date());
        socketConnect.setState(SocketConstants.CONNECT);
        redisCache.setCacheObject(Constants.LOGIN_SOCKET_KEY+uuid, socketConnect,expireTime, TimeUnit.MINUTES);
        log.info(MessageTemplate.socketConnectSuccess,uuid);
    }
}

MyWebSocketHandler.java

@RefreshScope
public class MyWebSocketHandler extends TextWebSocketHandler {
    /**
     * 日志
     */
    private static final Logger log = LoggerFactory.getLogger(MyWebSocketHandler.class);

    /**
     * 静态变量,用来记录当前在线连接数
     */
    private static final AtomicInteger onlineNum = new AtomicInteger();

    /**
     * 存放每个客户端连接对象
     */
    private static final ConcurrentHashMap<String, WebSocketSession> sessionPools = new ConcurrentHashMap<>();

    @Resource
    private final RedisCache redisCache = SpringUtils.getBean(RedisCache.class);

    @Value("${token.expireTime}")
    private int expireTime;

    /**
     * 在线人数加一
     */
    public static void addOnlineCount() { onlineNum.incrementAndGet(); }

    /**
     * 在线人数减一
     */
    public static void subOnlineCount() {
        onlineNum.decrementAndGet();
    }

    /**
     * 接受客户端消息
     *
     * @param session session
     * @param message message
     */
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        System.out.println(message);
        log.info(MessageTemplate.socketReceiveMessage, session.getAttributes().get(SocketConstants.SOCKET_KEY), message.getPayload());

    }

    /**
     * 建立连接后发送消息给客户端
     *
     * @param session session
     * @throws Exception e
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String uuid = session.getAttributes().get(SocketConstants.SOCKET_KEY).toString();
        WebSocketSession put = sessionPools.put(uuid, session);
        if (put == null) {
            addOnlineCount();
        }
        String format = StringUtils.format(MessageTemplate.socketConnectSuccess,uuid);
        TextMessage ok = new TextMessage(format);
        session.sendMessage(ok);
        log.info(MessageTemplate.socketSendMessage,uuid,format);
    }

    /**
     * 连接关闭后
     *
     * @param session session
     * @param status  status
     * @throws Exception e
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        String uuid = session.getAttributes().get(SocketConstants.SOCKET_KEY).toString();
        SocketConnect socketConnect = redisCache.getCacheObject(Constants.LOGIN_SOCKET_KEY + uuid);
        socketConnect.setLastOffTime(new Date());
        socketConnect.setState(SocketConstants.OFF);
        redisCache.setCacheObject(Constants.LOGIN_SOCKET_KEY+uuid, socketConnect,expireTime, TimeUnit.MINUTES);
        sessionPools.remove(uuid);
        subOnlineCount();
        log.info(MessageTemplate.socketConnectClose,uuid);
    }

    /**
     * 发送广播消息
     *
     * @param message 消息内容
     */
    public static void sendTopic(String message) {
        if (sessionPools.isEmpty()) {
            return;
        }
        for (Map.Entry<String, WebSocketSession> entry : sessionPools.entrySet()) {
            try {
                entry.getValue().sendMessage(new TextMessage(message));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 点对点发送消息
     *
     * @param uid     用户
     * @param message 消息
     */
    public static void sendToUser(String uid, String message) {
        WebSocketSession socketSession = sessionPools.get(uid);
        if (socketSession == null) {
            return;
        }
        try {
            socketSession.sendMessage(new TextMessage(message));
        } catch (IOException e) {
            log.error("send to user:{}, error! data:{}", uid, message);
        }
    }
}

WebSocketServer.java

@ServerEndpoint(value = "/api/websocket/{sid}",configurator = WebSocketConfig.class,encoders = WebSocketCustomEncoding.class)
@Component
public class WebSocketServer {

    @Resource
    private final RedisCache redisCache = SpringUtils.getBean(RedisCache.class);

    static Log log=LogFactory.get(WebSocketServer.class);

    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    //接收sid
    private String sid="";

    private static final Map<String,Object> map = new HashMap<>();


    /**
     * 连接建立成功调用的方法*/
    @OnOpen
    public void onOpen(Session session,@PathParam("sid") String sid) throws IOException {
        String cacheObject = redisCache.getCacheObject(Constants.LOGIN_SOCKET_KEY + sid);
        if(StringUtils.isNotNull(cacheObject)){
            this.session = session;
            webSocketSet.add(this);     //加入set中
            addOnlineCount();           //在线数加1
            log.info("有新窗口开始监听:"+sid+",当前在线人数为" + getOnlineCount());
            this.sid=sid;
            try {
                map.clear();
                map.put("type",0);
                map.put("data","连接成功");
                sendMessage(map);
            } catch (Exception e) {
                log.error("websocket IO异常");
            }
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        QRCodeBody qrCodeBody = redisCache.getCacheObject(QRCodeConstants.QR_STATUS_KEY + this.sid);
        if(StringUtils.isNotNull(qrCodeBody)){
            webSocketSet.remove(this);  //从set中删除
            subOnlineCount();           //在线数减1
            log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
            redisCache.deleteObject(QRCodeConstants.QR_STATUS_KEY + this.sid);
        }
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息*/
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到信息:"+message);
        sendInfo("123",session.getId());
    }

    /**
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
    /**
     * 实现服务器主动推送
     */
    public void sendMessage(Object message) throws IOException, EncodeException {
        this.session.getBasicRemote().sendObject(message);
    }


    /**
     * 群发自定义消息
     * */
    public static void sendInfo(Object message,@PathParam("sid") String sid){
        log.info("推送消息到窗口"+sid+",推送内容:"+message);
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值