2013-02-01 59 views

回答

-1

WebSockets基於HTTP請求。因此,你很可能延伸出的HttpServletWebSocketServlet的地方,所以從HttpServletRequest獲取IP的常用方法應該工作:

例子:

public class WebSocketsServlet extends HttpServlet { 

    private final WebSocketApplication app = new WebSocketApplication(); 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     WebSocketEngine.getEngine().register(
      config.getServletContext().getContextPath() + "/context", app); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 

     System.out.println("IP: " + req.getRemoteAddr()); 
     super.doGet(req, resp); 
    } 

} 
+2

這不是用java ee 7 websocket api(見jsr 356); http://java.net/projects/websocket-spec/; http://jcp.org/en/jsr/detail?id=356 –

2

getRemoteAddr()

你需要投您的套接字會話實例添加到實現標準JSR-356會話接口的TyrusSession。

您可能需要升級Tyrus,因爲我不確定您的版本是否支持此方法。我正在使用Tyrus 1.7,它適用於我。這裏是how to upgrade

2

另一種基於this answer來解決另一個問題的方法是獲取HandshakeRequest的頭文件。您正在查找的標題是以下任一項。

origin: [IP Address] 
x-forwarded-for: [Possibly a separate IP] 

只是爲了清楚起見,這裏是我的設置,我怎麼發現這一點:

  • WAMP 2.5上MYMACHINE:6060。這託管一個客戶端HTML頁面。
  • LabMachine上的Wamp 2.5:6060(正常連接)和LabMachine:6443(安全連接)。這起到代理的作用。
  • MyMachine上的GlassFish 4.0:8080(正常)和MyMachine:8181(SSL)。這是終點。

我通過自己的機器,實驗室機器和同事的機器連接到客戶端頁面。在任何情況下,網頁套接字請求的來源頭是

http://MyMachine:6060

然而,在每種情況下的x轉發主機頭是不同的,相匹配的實際客戶端的IP地址。