2016-01-22 284 views
0

我有一個運行websocket webapp的jetty 9.3.6服務器。我想獲取客戶端的IP地址以達到目的,並且我可以看到它存在於javax.websocket.Session對象中,但我不知道如何獲取它,因爲API不允許這樣做。有些人似乎把它投到TyrusSession對象(從org.glassfish.tyrus.core.TyrusSession),但是當我嘗試過,它編譯得很好,但在運行時在websocket服務器中提出ClassCastException。我已經包含在我的build.gradle如下:如何在javax.websocket服務器中獲取遠程客戶端地址?

compile 'org.glassfish.tyrus:tyrus-core:1.12' 

什麼讓一個javax.websocket.Session客戶端IP地址的正確方法是什麼?

回答

1

SO rules一致,我在這裏回答我自己的問題。

我得到了我的線索,當我試圖把它轉換爲TyrusSession和Jetty抱怨(引發ClassCastException)在錯誤日誌中稱這是JsrSession不能被鑄造成TyrusSession。不過,我剛剛打印的Session對象在我的日誌,這樣的事情出現了:

session: WebSocketSession[....] 

然後我試着將它轉換爲org.eclipse.jetty.websocket.common.WebSocketSession然後抱怨實際上是一個JsrSession,然後導致了對象我發現以下解決方案:

@ServerEndpoint (value="/mySillyApp", configurator= ..., decoders={...}) 
public class MySillyWebSocketServer 
{ 
    @OnOpen 
    public void open (Session session, EndpointConfig config) 
    { 
     JsrSession jsrSession = (JsrSession) session; // import org.eclipse.jetty.websocket.jsr356.JsrSession; 
     WebSocketSession webSocketSession = jsrSession.getWebSocketSession(); // import org.eclipse.jetty.websocket.common.WebSocketSession; 
     String clientIPAddressString = webSocketSession.getRemoteAddress().getHostString(); 
     .... 
    } 
    ... 
} 

顯然,您將不得不在相應的類路徑中包含相應的jar。對於gradle這個,你在dependencies {...}部分做到這一點:

compile 'org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106' 
    compile 'org.eclipse.jetty.websocket:websocket-common:9.1.0.v20131115' 

希望我的方法和細節可以幫助別人。

相關問題