java - 将 HTTP header 添加到 JAX-WS 服务响应

标签 java servlets soap jax-ws

我正在开发 Java Web 服务。此刻我可以得到 Http header 请求。但我想添加更多 header 请求。

我目前正在 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);
    }
}

此策略的问题是添加的 header 是静态的。

使用 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]", ""));
    }

所以,我真正想要的是将动态 soap 消息与过滤器结合起来。我怎样才能做到这一点?

最佳答案

虽然我仍然不完全清楚您真正想要什么,但我将描述如何在 SOAP 网络服务响应中添加 HTTP header 。执行此操作最干净的地方是在 JAX-WS 处理程序中,这与您已经拥有的 SoapClass 形式没有什么不同。

要在您的 SOAPHandler 中执行此操作,您必须首先获得对底层 HttpServletResponse 中 header 列表的访问权。此列表由 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;
    }

另一种方法是访问作为 Web 服务响应基础的 HttpServletResponse:

     @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;
    }

关于java - 将 HTTP header 添加到 JAX-WS 服务响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129827/

相关文章:

java - 哪个 Java PDF 库允许我以不同方向打印页面的不同部分?

python - 列表项的 Sharepoint 过滤器 (GetListItems)

web-services - SOAP Web 服务所需的正确虚拟目录访问权限级别是多少?

python - 是否可以使用 python suds 从文件系统中读取 wsdl 文件?

java - 显示 3D 地形 Mapbox v10 Android

具有多个值的 Java 映射 : container class or multiple maps?

java - PaintComponent 和 java 图形

java - HTTPServletRequest getServerPort 返回 -1

css - <link> 未从 JSP 内部连接到 CSS

java - 无法从 servlet 访问我的数据库