2012-10-04 26 views
9

Tôi đang cố gắng để lấy IP của khách hàng với JAX-WS, tôi đã sử dụng:ws jax nhận client ip

@Resource 
WebServiceContext wsContext; 

MessageContext mc = wsContext.getMessageContext(); 
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST); 

log.info("["+req.getRemoteAddr()+"]) 

tôi nhận được một NullPointerException trong req, mc không phải là null.

Câu hỏi của tôi là JAR để sử dụng cho HttpServletRequest vì tôi đang sử dụng ứng dụng độc lập Java?

Cảm ơn

Trả lời

15

Cách nhận địa chỉ máy khách webservice cho dịch vụ jax-ws tùy thuộc vào việc bạn có đang ở:

  • Chạy webservice của bạn như là một servlet (trong một container Java EE), hoặc
  • Chạy webservice của bạn như một ứng dụng độc lập (Java SE 6 hoặc 7).

Servlet Webservices Nếu webservice của bạn là một servlet sau đó sử dụng các giải pháp của các bài viết đầu tiên có chứa những điều sau đây:

HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST); 

Ứng dụng Webservices: JAX-WS 2.1 Nếu bạn là bằng cách sử dụng một ứng dụng Java (Java SE), bạn không có ngữ cảnh servlet, do đó, HttpServletRequest sẽ là rỗng. Bạn cần phải sử dụng phương pháp của bài sau, một trong đó có các dòng sau:

HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE); 

Lưu ý: đây chỉ hoạt động với việc thực hiện 2.1 stack/tham khảo JAX-WS.

Ứng dụng Webservices: JAX-WS 2.2

Trong JAX-WS 2.2 giá trị của JAXWSProperties.HTTP_EXCHANGE đã thay đổi từ "com.sun.xml.ws.http.exchange" (giá trị nó được trong JAX- WS 2.1) thành "com.sun.xml.internal.ws.http.exchange". Điều đó có nghĩa rằng một cuộc gọi đến

HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE); 
InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
String remoteHost = remoteAddress.getHostName(); 

sẽ trả về null trong JAX-WS 2.2 và bạn sẽ nhận được một NullPointerException trên dòng thứ hai, và quan trọng hơn, không thể có được địa chỉ từ xa của khách hàng.

Nếu bạn sử dụng cuộc gọi sau để thay thế (sử dụng giá trị bằng chữ, ugh!):

HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange"); 
InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
String remoteHost = remoteAddress.getHostName(); 

bạn sẽ nhận được giá trị không null và sẽ có thể lấy địa chỉ khách hàng. Vì vậy, cách bạn nhận địa chỉ từ xa của máy khách phụ thuộc vào cách bạn triển khai mã (servlet hoặc ứng dụng) và phiên bản JAX-WS bạn đang sử dụng (JAX-WS 2.1 hoặc 2.2).

Khuyến nghị

  • Servlets: Nếu bạn đang triển khai webservice JAX-WS của bạn trong một servlet bạn luôn có thể sử dụng các cuộc gọi để có được tài sản MessageContext.SERVLET_REQUEST không có vấn đề gì phiên bản của JAX-WS 2 bạn đang sử dụng.

  • Applications: Nếu bạn đang triển khai webservice JAX-WS của bạn trong một ứng dụng mà bạn luôn có thể sử dụng cuộc gọi HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange"); dù bạn đang sử dụng JAX-WS 2.1 hoặc 2.2, do đó nó có lẽ là tốt hơn để sử dụng chuỗi chữ trong mã của bạn thay vì ký hiệu là JAXWSProperties.HTTP_EXCHANGE.

Vì khó sử dụng theo nghĩa đen, tốt hơn nên có mã mạnh hơn hoạt động trên các phiên bản JAX-WS chứ không phải mã đẹp hơn.

Tôi hy vọng nhóm JAX-WS sẽ khắc phục sự cố này và khôi phục giá trị JAXWSProperties.HTTP_EXCHANGE về giá trị hữu ích một lần nữa.

Rất cám ơn các áp phích trước đó đã chỉ ra các cách khác nhau để tìm địa chỉ từ xa của các máy khách JAX-WS. Các thông tin rất hữu ích :)

+0

Có thể cần lưu ý rằng với kết nối HTTPS không có giá trị nào được liên kết với khóa '" com.sun.xml.ws.http.exchange "'. Nhưng với chuỗi chữ "" com.sun.xml.internal.ws.http.exchange "' bạn có thể lấy một đối tượng và đưa nó vào 'HttpsExchange'. Được thử nghiệm với Java 7 (chính thức) với JAX-WS 2.2. –

1

Đây là câu trả lời, tôi nghĩ bạn nên khởi chạy mc và req trong phương pháp chú thích WebMethod. Geting the IP Address Of A client For a webservice

+0

đó là những gì tôi đã làm, vấn đề là im sử dụng máy chủ HTTP nhúng, vì vậy: HttpServletRequest req = (HttpServletRequest) mc.get (MessageContext.SERVLET_REQUEST); không chính xác, đó là những gì tôi đang tìm kiếm. Cảm ơn anyway – bazic

6

nếu chúng tôi sử dụng một máy chủ Http nhúng, chúng tôi có thể nhận được IP của khách hàng như thế này:

@Resource 
WebServiceContext wsContext; 

Sau đó, trong phương pháp web:

@WebMethod 
MessageContext msgx = wsContext.getMessageContext(); 
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE); 
log.info("["+exchange.getRemoteAddress().getAddress()+"]) 

Hy vọng nó sẽ giúp người khác

-1

Các mã sau đây có thể làm việc:

HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest"); 
String hostIp = request.getRemoteAddr(); 
+0

Nếu bạn muốn nhận một thể hiện của HttpServletRequest, hãy sử dụng 'MessageContext.SERVLET_REQUEST' làm khóa –

Các vấn đề liên quan