前不久,网上出现了关于websocket内存马的介绍,经过试用发现效果不错。但是原文(https://github.com/veo/wsMemShell/),对于原理的介绍一笔带过,看过之后,依然有很多疑问。于是就尝试学习一下WebSocket内存马的实现原理。
-
注解方式:@ServeEndpoint
-
继承抽象类方式:javax.websocket.Endpoint
-
onOpen: 会话建立
-
onClose: 会话关闭
-
onError: 会话异常
-
onMessage: 接收到消息
注解方式
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.*;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.server.ServerEndpoint;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> java.io.IOException;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@ServerEndpoint</span>(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"/websockets"</span>)</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__class" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">class</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">WebSocketServer</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">private</span> Session session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@OnOpen</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__function" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">void</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">onOpen</span><span class="code-snippet__params" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">(Session session)</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">this</span>.session = session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> System.out.println(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"已连接!Session: "</span> + session.toString());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">try</span> {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> session.getBasicRemote().sendText(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"a"</span>);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> } <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">catch</span> (IOException e) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> e.printStackTrace();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@OnMessage</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__function" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">void</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">onMessage</span><span class="code-snippet__params" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">(Session session, String message)</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> System.out.println(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"onMessage:"</span> + message);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@OnClose</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__function" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">void</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">onClose</span><span class="code-snippet__params" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">(Session session, CloseReason closeReason)</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> System.out.println(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"CloseReason:"</span> + closeReason.toString());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@OnError</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__function" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">void</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">onError</span><span class="code-snippet__params" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">(Throwable throwable)</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> throwable.printStackTrace();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">}</span>
继承抽象类方式
-
Endpoint实现类:主要实现3个标准生命周期方法(onOpen、onError、onClose),添加MessageHandler对象
-
MessageHandler实现类:实现onMessage方法
-
ServerApplicationConfig实现类:完成Endpoint的URI路径注册
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__comment" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; font-style: italic; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">//Endpoint实现类</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.Endpoint;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.EndpointConfig;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.MessageHandler;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.Session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> java.io.IOException;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__class" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">class</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">WebSocketServer2</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">extends</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Endpoint</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">private</span> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Session</span> session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> @<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Override</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> void onOpen(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Session</span> session, <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">EndpointConfig</span> endpointConfig) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> this.session = session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> session.addMessageHandler(new <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">MessageHandler</span>.<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Whole</span><<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">String</span>>() { <span class="code-snippet__comment" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; font-style: italic; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">//匿名类实现MessageHandler</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> @<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Override</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> void onMessage(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">String</span> message) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">System</span>.out.<span class="code-snippet__built_in" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">println</span>(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"onMessage: "</span>+message);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> });</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">System</span>.out.<span class="code-snippet__built_in" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">println</span>(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"已连接WebsocketServer: "</span> + session.<span class="code-snippet__built_in" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">toString</span>());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">try</span> {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> session.getBasicRemote().sendText(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"a"</span>);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> } <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">catch</span> (<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">IOException</span> e) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> e.printStackTrace();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">}</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__comment" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; font-style: italic; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">//ServerApplicationConfig实现类</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.Endpoint;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.server.ServerApplicationConfig;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> javax.websocket.server.ServerEndpointConfig;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> java.util.HashSet;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span> java.util.Set;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__class" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">class</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">EndpointApplicationConfig</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">implements</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">ServerApplicationConfig</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> @<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Override</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Set</span><<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">ServerEndpointConfig</span>> getEndpointConfigs(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Set</span><<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Class</span><? extends <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Endpoint</span>>> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">set</span>) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Set</span><<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">ServerEndpointConfig</span>> result = new <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">HashSet</span><>();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">if</span> (<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">set</span>.<span class="code-snippet__built_in" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">contains</span>(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">WebSocketServer2</span>.<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">class</span>)) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> result.add(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">ServerEndpointConfig</span>.<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Builder</span>.create(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">WebSocketServer2</span>.<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">class</span>, <span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"/websockets2"</span>).build());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">return</span> result;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> @<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Override</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Set</span><<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Class</span><?>> getAnnotatedEndpointClasses(<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Set</span><<span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Class</span><?>> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">set</span>) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__type" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">System</span>.out.<span class="code-snippet__built_in" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">println</span>(<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">set</span>);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">return</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">set</span>;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">}</span>
变量存储情况如下,通过注解方式实现的WebSocketServer类存入了filteredPojoEndpoints,而filteredEndpointConfigs存储的是EndpointApplicationConfig#getEndpointConfigs返回的DefaultServerEndpointConfig。
-
addEndpoint(javax.websocket.server.ServerEndpointConfig):该方法中,会根据传入的ServerEndpointConfig对象进行URI路径注册,其中包含了该对象在创建时指定的Endpoint实现类。
-
addEndpoint(java.lang.Class<?>):该方法中,会获取传入的POJO类的注解,根据注解的参数值创建ServerEndpointConfig对象,然后调用上面的重载方法,进行URI路径注册。
-
实现Endpoint,MessageHandler.onMessage中实现木马通讯功能
-
为Endpoint创建ServerEndpointConfig
-
依次获取ServletConext和WsServerContainer
-
通过WsServerContainer.addEndpoint添加ServerEndpointConfig
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><%@ page <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span>=<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"javax.websocket.server.ServerEndpointConfig"</span> %></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><%@ page <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span>=<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"javax.websocket.server.ServerContainer"</span> %></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><%@ page <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span>=<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"javax.websocket.*"</span> %></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><%@ page <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">import</span>=<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"java.io.*"</span> %></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><br style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><%!</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">static</span> <span class="code-snippet__class" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">class</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">C</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">extends</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Endpoint</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">implements</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">MessageHandler</span>.<span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">Whole</span><<span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">String</span>> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">private</span> Session session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@Override</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__function" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">void</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">onMessage</span><span class="code-snippet__params" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">(String s)</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">try</span> {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> Process process;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">boolean</span> bool = System.getProperty(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"os.name"</span>).toLowerCase().startsWith(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"windows"</span>);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">if</span> (bool) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> process = Runtime.getRuntime().exec(<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">new</span> String[] { <span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"cmd.exe"</span>, <span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"/c"</span>, s });</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> } <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">else</span> {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> process = Runtime.getRuntime().exec(<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">new</span> String[] { <span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"/bin/bash"</span>, <span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"-c"</span>, s });</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> InputStream inputStream = process.getInputStream();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> StringBuilder stringBuilder = <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">new</span> StringBuilder();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">int</span> i;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">while</span> ((i = inputStream.read()) != -<span class="code-snippet__number" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #2fb0f2; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #3db5f3;" data-darkreader-inline-outline="" data-darkreader-inline-color="">1</span>)</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> stringBuilder.append((<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">char</span>)i);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> inputStream.close();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> process.waitFor();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> session.getBasicRemote().sendText(stringBuilder.toString());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> } <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">catch</span> (Exception exception) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> exception.printStackTrace();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__meta" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #b5afa6; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #b5aea4;" data-darkreader-inline-outline="" data-darkreader-inline-color="">@Override</span></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__function" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">public</span> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">void</span> <span class="code-snippet__title" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">onOpen</span><span class="code-snippet__params" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">(<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">final</span> Session session, EndpointConfig config)</span> </span>{</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">this</span>.session = session;</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> session.addMessageHandler(<span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">this</span>);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">%></span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""><%</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> String path = request.getParameter(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"path"</span>);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> System.out.println(path);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> ServletContext servletContext = request.getSession().getServletContext();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(C.class, path).build();</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> ServerContainer container = (ServerContainer) servletContext.getAttribute(ServerContainer.class.getName());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">try</span> {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">if</span> (servletContext.getAttribute(path) == <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">null</span>){</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> container.addEndpoint(configEndpoint);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> servletContext.setAttribute(path,path);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> out.println(<span class="code-snippet__string" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #ef3564; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #f0426e;" data-darkreader-inline-outline="" data-darkreader-inline-color="">"success, connect url path: "</span> + servletContext.getContextPath() + path);</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> } <span class="code-snippet__keyword" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; color: #cf8a4b; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial; --darkreader-inline-color: #d39359;" data-darkreader-inline-outline="" data-darkreader-inline-color="">catch</span> (Exception e) {</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> out.println(e.toString());</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline=""> }</span>
<span class="code-snippet_outer" style="margin: 0px; padding: 0px; outline: 0px; max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important; --darkreader-inline-outline: initial;" data-darkreader-inline-outline="">%></span>
1、websocket内存马项目:https://github.com/veo/wsMemShell
2、java-memshell-scanner项目:https://github.com/c0ny1/java-memshell-scanner
银河实验室
发表评论
您还未登录,请先登录。
登录