2015-07-28 78 views

回答

8

您可以在握手期間用HandshakeInterceptor設置客戶端IP的WebSocket的會話屬性:

public class IpHandshakeInterceptor implements HandshakeInterceptor { 

    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, 
      WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { 

     // Set ip attribute to WebSocket session 
     attributes.put("ip", request.getRemoteAddress()); 

     return true; 
    } 

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, 
      WebSocketHandler wsHandler, Exception exception) {   
    } 
} 

與握手攔截器配置您的端點:

@Override 
protected void configureStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/ws").addInterceptors(new IpHandshakeInterceptor()).withSockJS(); 
} 

而且在獲取屬性的處理程序方法:

@MessageMapping("/destination") 
public void handlerMethod(SimpMessageHeaderAccessor ha) { 
    String ip = (String) ha.getSessionAttributes().get("ip"); 
    ... 
} 
+1

這是可能得到的服務這個屬性沒有通過SimpMessageHeaderAccessor?我的意思是類似注入HttpServletRequest – shark

+0

總是讓ip爲127.0.0.1。如何獲得遠程客戶端的ip? – shabinjo

2

下面的例子更新爲得到確切的遠程客戶端IP:

@Component 
public class IpHandshakeInterceptor implements HandshakeInterceptor { 

    @Override 
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, 
           WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { 
    // Set ip attribute to WebSocket session 
    if (request instanceof ServletServerHttpRequest) { 
     ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; 
     String ipAddress = servletRequest.getServletRequest().getHeader("X-FORWARDED-FOR"); 
     if (ipAddress == null) { 
      ipAddress = servletRequest.getServletRequest().getRemoteAddr(); 
     } 
     attributes.put("ip", ipAddress); 
    } 
    return true; 
} 

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, 
          WebSocketHandler wsHandler, Exception exception) { 
} 
}