将HTTP标头添加到JAX-WS服务响应

Gol*_*nes 7 java soap servlets jax-ws

我正在开发一个Java Web服务.此时我可以获得Http头请求.但我想添加更多标头请求.

我目前正在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

此策略的问题是添加的标头是静态的.

使用SoapHandler类,我可以获得SOAP消息 - 动态:

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]", ""));
    }
Run Code Online (Sandbox Code Playgroud)

所以,我真正想要的是用过滤器加入动态肥皂消息.我怎样才能做到这一点?

kol*_*sus 6

虽然我还不完全清楚你真正想要的是什么,但我将描述如何在SOAP Web服务响应中添加HTTP头.最干净的地方是在JAX-WS处理程序中,与您已经拥有的形式不同SoapClass.

要在SOAPHandler中执行此操作,必须首先获取对底层标头列表的访问权限HttpServletResponse.此列表由以下人员提供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;
    }
Run Code Online (Sandbox Code Playgroud)

另一种方法是访问HttpServletResponseWeb服务响应的基础:

     @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;
    }
Run Code Online (Sandbox Code Playgroud)

  • @kolossus我知道这是一篇旧文章,但谢谢,你的后一个变体让我度过了难关,尽管响应布尔值总是返回空。然而,HttpServ.. 响应永远不会为空,因此我不需要布尔检查。谢谢! (2认同)