2013-02-05 25 views
9

Tôi đang sử dụng Netbeans để tự động tạo các máy khách webservice dựa trên các tệp WSDL. Điều này hoạt động tốt, ngoại trừ các dịch vụ web tôi đang sử dụng yêu cầu tôi chuyển một cookie tùy chỉnh trong tiêu đề HTTP tới mọi dịch vụ web để chứng minh danh tính của tôi.Máy khách JAX-WS: duy trì phiên/cookie trên nhiều dịch vụ

Tôi sử dụng một dịch vụ web có tên Utility để nhận ủy quyền của mình. Điều này đặt cookie cần được cung cấp trong tất cả các cuộc gọi tiếp theo tới bất kỳ dịch vụ web nào.

Điều này có thể được thực hiện bằng cách đặt javax.xml.ws.session.maintain thành true trên BindingProvider của cổng cho dịch vụ web. Điều này hoạt động tốt cho các cuộc gọi tiếp theo đến các phương thức trong dịch vụ web Utility. Vấn đề là điều này chỉ duy trì phiên/cookie cho dịch vụ web đơn đó. Tôi cũng cần nó trên những người khác.

Tôi cần cookie được chuyển đến riêng biệt dịch vụ web có tên History Tôi làm cách nào để thực hiện việc này? Có khả thi để có một lớp dịch vụ siêu mà cả Tiện ích và Lịch sử có thể mở rộng và chia sẻ cùng một trạng thái phiên với?

Trả lời

14

Tôi đã tìm được giải pháp.

Bạn có thể lấy tiêu đề phản ứng sử dụng này sau khi bạn đã thực hiện các cuộc gọi:

((BindingProvider)port).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS); 

Tìm Set-Cookie header và lưu trữ giá trị của nó.

Sau đó, trước khi yêu cầu tiếp theo của bạn (trong bất kỳ webservice), bạn có thể thiết lập các tiêu đề Cookie:

((BindingProvider)port).getRequestContext().put(
      MessageContext.HTTP_REQUEST_HEADERS, 
       Collections.singletonMap("Cookie", Collections.singletonList(cookieValue) 
      ) 
     ); 
+0

Có lẽ bạn phải thêm rằng trích xuất Cookie theo cách này chỉ có thể trực tiếp sau cuộc gọi đầu tiên - vì chỉ có "Set-Cookie" được đặt. Nhưng nontheless ... cảm ơn bạn rất nhiều. Điều này đã cứu tôi rất nhiều thời gian. – cljk

3

Chỉ cần cho ý kiến ​​vì giải pháp trên không làm việc cho tôi. Tôi nhận được UnsupportedOperationException. Tôi tin rằng vấn đề là do singletonMap không cho phép thay đổi. tiêu đề xml cũng cần thiết, vì vậy tôi đặt những tiêu đề đầu tiên.

Map<String, List<String>> headers= CastUtils.cast((Map)port.getRequestContext().get("javax.xml.ws.http.request.headers")); 
if (headers == null) { 
    headers = new HashMap<String, List<String>>(); 
    port.getRequestContext().put("javax.xml.ws.http.request.headers", headers); 
} 

headers.put("Cookie", Collections.singletonList(cookieValue)); 
((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
+0

Có, SingletonMaps là không thay đổi - tôi đã sử dụng nó chỉ đơn thuần là một tiện ích – bradvido

+1

Bạn nên xem lại mã để gọn nhẹ hơn, biết MessageContext.HTTP_REQUEST_HEADERS == "javax.xml.ws.http.request.headers" –

+0

Phiên bản của anh ấy thực sự là một char ngắn hơn kể cả trích dẫn, nhưng tôi biết ý bạn là gì. Sử dụng hằng số chắc chắn an toàn hơn. :) – Martin

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