2015-05-08 13 views
7

Tôi đang phát triển Dịch vụ web Java. Tại thời điểm này tôi có thể nhận được yêu cầu tiêu đề Http. Nhưng tôi muốn thêm nhiều yêu cầu tiêu đề hơn.Thêm tiêu đề HTTP vào phản hồi dịch vụ JAX-WS

Tôi hiện đang thực hiện việc này trong bộ lọc servlet.

@WebFilter(urlPatterns = {"/*"}) 
public class AddHeader implements Filter { 

    @Resource 
    private WebServiceContext context; 

    public AddHeader() { 
    } 

    @Override 
    public void init(FilterConfig fConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(
      ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     if (request.getContentLength() != -1 && context != null) { 
      MessageContext mc = context.getMessageContext(); 
      ((HttpServletResponse) response).addHeader(
        "Operation", "something" 
      ); 
     } 

     chain.doFilter(request, response); 
    } 
} 

Vấn đề với chiến lược này là tiêu đề được thêm là tĩnh.

Với lớp SoapHandler tôi có thể có được một thông điệp SOAP - năng động:

public class SoapClass implements SOAPHandler<SOAPMessageContext> { 


    @Override 
    public boolean handleMessage(SOAPMessageContext messageContext) { 
     log(messageContext); 
     return true; 
    } 

    @Override 
    public Set<QName> getHeaders() { 
     Set<QName> qNames = Collections.EMPTY_SET; 
     return qNames; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext messageContext) { 
     log(messageContext); 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
    } 


    public static String getMsgAsString(SOAPMessage message) { 
     String msg = null; 
     try { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      message.writeTo(baos); 
      msg = baos.toString(); 
     } catch (SOAPException | IOException soape) { 
     } 
     return msg; 
    } 


    private String soapToString(SOAPMessage message, boolean indent) { 
     final StringWriter sw = new StringWriter(); 

     try { 
      TransformerFactory.newInstance().newTransformer().transform(
        new DOMSource(message.getSOAPPart()), 
        new StreamResult(sw)); 
     } catch (TransformerException e) { 
      throw new RuntimeException(e); 
     } 

     return (indent ? sw.toString() : sw.toString().replaceAll("[\\r\\n]", "")); 
    } 

Vì vậy, những gì tôi thực sự muốn là để tham gia nhắn xà phòng năng động với bộ lọc. Làm thế nào tôi có thể đạt được điều này?

+0

Ý anh là gì bằng cách "tiêu đề là tĩnh"? Tiêu đề tĩnh so với tiêu đề động là gì? – kolossus

+0

"Hoạt động", "cái gì đó" là giá trị tĩnh mà tôi đã xác định. Tôi muốn có thể có nội dung xà phòng khác nhau cho mỗi yêu cầu – Goldbones

+0

Tôi vẫn không hiểu người đàn ông: "giá trị tĩnh" so với "nội dung xà phòng" là gì? Bạn đang tìm cách đặt tiêu đề HTTP dựa trên điều kiện? Hay bạn đang tìm cách thiết lập một tiêu đề SOAP? * Tôi muốn có thể có Nội Dung Xà Phòng khác nhau cho mỗi yêu cầu * thực sự không dịch tốt lắm. Bạn có thể đăng hình minh họa hay gì đó không? – kolossus

Trả lời

6

Mặc dù tôi vẫn chưa hoàn toàn rõ ràng về những gì bạn thực sự muốn, tôi sẽ mô tả cách thêm tiêu đề HTTP vào phản hồi dịch vụ web SOAP. Nơi sạch sẽ nhất để thực hiện điều này là trong trình xử lý JAX-WS, không giống như những gì bạn đã có ở dạng SoapClass.

Để thực hiện việc này trong SOAPHandler, trước tiên bạn phải có quyền truy cập vào danh sách tiêu đề trong phần cơ bản HttpServletResponse. Danh sách này được cung cấp bởi SOAPMessageContext:

@Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     //This property checks whether the handler is being invoked for a service response 
     boolean response= ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); 

     if (response) { 
      //this is a JAX-WS-provided map of HTTP headers 
      Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_RESPONSE_HEADERS); 
      if (null == headers) { 
       //create a new map of HTTP headers if there isn't already one 
       headers = new HashMap<String, List<String>>(); 
      } 
      //add your desired header 
      headers.put("Operation",Collections.singletonList("something"); 
     } 
     return true; 
    } 

Một phương pháp khác là để truy cập HttpServletResponse đó là cơ sở để đáp ứng dịch vụ web:

 @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     //This property checks whether the handler is being invoked for a service response 
     boolean response= ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); 

     if (response) { 
      //this is underlying http response object 
      HttpServletResponse response = (HttpServletResponse) context.get(MessageContext.SERVLET_RESPONSE); 

      //add your desired header 
      response.addHeader("Operation", "something"); 
      } 
     return true; 
    } 
+0

Tôi đã thử phương pháp đó trước đây. Tôi nhận được ngoại lệ - request.headers là thuộc tính chỉ đọc. – Goldbones

+0

Lỗi lầm của tôi @Goldbones; nó phải là 'HTTP_RESPONSE_HEADERS' không phải là' HTTP_REQUEST_HEADERS'. Tôi cũng đã đăng một cách tiếp cận khác. Cách tiếp cận bạn đã cố gắng luôn là một phần trong câu hỏi của bạn: giúp mọi người tiết kiệm thời gian và đặt ra một câu hỏi hay hơn. – kolossus

+0

Hoàn hảo! Đó chính là điều tôi muốn. Tôi đã làm điều đó trong một bài đăng khác, nhưng không ai có thể đưa ra một câu trả lời thích hợp. Trong mã mà bạn cung cấp, thay vì nội dung tĩnh ("một cái gì đó" sẽ luôn là câu trả lời tương tự trong các yêu cầu khác nhau), tôi có nội dung động (theo ngữ cảnh Soap Message), điều này rất tuyệt vì bây giờ tôi có các thông điệp khác nhau cho các yêu cầu khác nhau. Cảm ơn! – Goldbones

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