2012-07-26 10 views
10

Tôi đang sử dụng mã sau đây để có được địa chỉ IP của khách hàng cho một JAX-WS một chiều gọi phương thức:cách đáng tin cậy để có được địa chỉ IP của khách hàng trong CXF JAX-WS một chiều gọi phương thức

protected HttpServletRequest getServletRequest() { 
    MessageContext ctx = wsContext.getMessageContext(); 
    return (HttpServletRequest) ctx.get(MessageContext.SERVLET_REQUEST); 
} 

protected synchronized String getClientIp() { 
    String clientIp = ""; 
    HttpServletRequest request = getServletRequest(); 
    if (request != null) { 
     clientIp = request.getRemoteAddr(); 

     // Handle proxy 
     String header = request.getHeader("x-forwarded-for"); 
     if(header != null && !header.isEmpty()) { 
      clientIp = header.split(",")[0]; 
     } 
    } 
    return clientIp; 
} 

Khi nhiều khách hàng kết nối, địa chỉ IP được truy lục cho một yêu cầu đôi khi là giá trị được lưu vào bộ nhớ cache không chính xác từ một yêu cầu trước đó. Cách đáng tin cậy để nhận địa chỉ IP của người khởi tạo cuộc gọi một chiều là gì?

Trả lời

18

bạn có thể sử dụng đoạn mã sau để tìm ra IP client

Message message = PhaseInterceptorChain.getCurrentMessage(); 
HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST); 
request.getRemoteAddr() 
1

Nếu mục đích của bạn là thiết lập kết nối dịch vụ web, thì có lẽ WS-Addressing có thể hữu ích.

Đề án giải quyết thay thế sang một bên, HttpServletRequest.getRemoteAddr kết hợp với địa chỉ IP thay thế getHeader được xác định là chính xác. Nếu không thì không có nhiều sự truy đòi (yea, tôi có thể tưởng tượng nhiều mâu thuẫn nhau, nhưng nguyên tắc vẫn còn).

Vì vậy, bạn có bản phát hành ổn định mới nhất/lớn nhất cho nền tảng của mình không? Nghe có vẻ giống như một vấn đề với nền tảng của bạn - trong đó bạn chưa cung cấp bất kỳ chi tiết nào.

+0

tôi sẽ xem xét thông qua WS-Addressing nếu nó có thể giúp đỡ. Tôi đang sử dụng cxf-2.5.2 chạy trên tomcat-6.0.35. – amo