Java(Web 服务 - SOAP)- 如何在客户端添加 SOAP 处理程序并正确启用 MTOM?

2023-12-29

Java - JDK 1.6.0.7 - WSGEN -版本:JAX-WS RI 2.2.3-b01-


我有以下问题:

SOAPBinding binding = (SOAPBinding)((BindingProvider)port).getBinding();
binding.setMTOMEnabled(true);

List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.addAll(binding.getHandlerChain());
handlerChain.add(new MyHandlerSecurity("admin", "admin"));
binding.setHandlerChain(handlerChain);

使用此代码,SoapHeader 是正确的,但附件始终是内联 base64 文本。

//List<Handler> handlerChain = new ArrayList<Handler>();
//handlerChain.addAll(binding.getHandlerChain());
//handlerChain.add(new MyHandlerSecurity("admin", "admin"));
//binding.setHandlerChain(handlerChain);

当 handlerChain 被注释掉时,您将看到附件作为 xop 引用,但没有 SoapHeader,因此客户端未经过身份验证...

如何在客户端添加处理程序并正确启用 MTOM?


我不确定我的问题是否正确,但我想几个月前我也遇到了同样的问题,所以这是我的解决方案:

首先,您需要一个 HeaderHandler 类,它创建肥皂头元素,它应该如下所示:


    import javax.xml.namespace.QName;
    import javax.xml.soap.SOAPElement;
    import javax.xml.soap.SOAPEnvelope;
    import javax.xml.soap.SOAPHeader;
    import javax.xml.ws.handler.MessageContext;
    import javax.xml.ws.handler.soap.SOAPHandler;
    import javax.xml.ws.handler.soap.SOAPMessageContext;


    public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {

        public boolean handleMessage(SOAPMessageContext smc) {
            Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
            String AUTH_TK = "http://www.myurl.com:port/subdir/etc/";
            String NOPREFIX="";//no prefix
            String PREFIX_XMLNS="xmlns";
            String value =  "123456";
            if (outboundProperty.booleanValue()) {
                try {
                    SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
                    SOAPHeader header = envelope.addHeader();
                    //<AuthorizationToken xmlns="http://www.myurl.com:port/subdir/etc/">
                    SOAPElement authorizationToken = header.addChildElement("AuthorizationToken", PREFIX_XMLNS, AUTH_TK);
                    //<Token>value</Token>
                    SOAPElement usernameToken =
                        authorizationToken.addChildElement("Token", NOPREFIX);
                        usernameToken.addTextNode(value);
                        //<Token>value</Token>
                    SOAPElement usernameToken =
                        authorizationToken.addChildElement("Token", PREFIX);
                        usernameToken.addTextNode(value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return outboundProperty;
        }


        public Set<QName> getHeaders() {
            return null;
        }

        public void close(MessageContext arg0) {

        }

        public boolean handleFault(SOAPMessageContext arg0) {
            return false;
        }
    }

之后,您创建一个 HeaderHandlerResolver 来处理标头创建并将其插入处理程序链中:


    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.ws.handler.Handler;
    import javax.xml.ws.handler.HandlerResolver;
    import javax.xml.ws.handler.PortInfo;

    public class HeaderHandlerResolver implements HandlerResolver {

    @SuppressWarnings("unchecked")
    public List<Handler> getHandlerChain(PortInfo portInfo) {
          List<Handler> handlerChain = new ArrayList<Handler>();
          HeaderHandler hh = new HeaderHandler();
          handlerChain.add(hh);
          return handlerChain;
       }
    }

之后,您在客户端中添加:


        try{
            //new service instance (your service should be extending javax.xml.ws.Service;)
            YourServiceProxy service = new YourServiceProxy();
            //calls the header handler resolver ;)
            service.setHandlerResolver(new HeaderHandlerResolver());
            //get the service
            YourService port = (YourService)service.getYourService();
            //call the service 
            port.yourMethod()   
        } catch (Exception e) {
            e.printStackTrace();
        }

顺便说一句,我没有测试这个特定的标头,我修改了以前的标头处理程序,所以它可能不准确,但我认为它非常接近,我真的希望它对您有帮助,尝试一下并告诉我们如何它来了,如果仍然不起作用,我会尽力帮助你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java(Web 服务 - SOAP)- 如何在客户端添加 SOAP 处理程序并正确启用 MTOM? 的相关文章

随机推荐

  • 如何从我的 makefile 中调用特定目标?

    a echo 1 b echo 2 c if d somefolder then how do I invoke target b here fi 我如何调用目标b内部目标c 根据我的情况 有点像antcall 如果你熟悉 ant 的话 说
  • 如何在 MiUi pre - Marshmallow 中请求权限?

    int permissionCheck ContextCompat checkSelfPermission mActivity Manifest permission RECEIVE SMS ActivityCompat requestPe
  • 如何确定应用程序中使用了哪些 JAR

    现有应用程序的类路径中有大量 JAR 文件 为了确定起见 最初必须有人添加所有 JAR 有些 JAR 显然没有被使用 我们已经删除了其中一些不需要的 JAR 没有造成任何问题 如何确定哪些 JAR 正在使用 哪些 JAR 不需要 除了试错法
  • Django 性能测试套件将报告指标(数据库查询等)

    我有一个复杂的 Django Web 应用程序 其中投入了很多人年的工作 有时可能需要优化 我可以使用 例如 django 的测试客户端编写几个常见的操作 流程的脚本 是否有一些程序 给定这样的 python 脚本 然后将运行 并报告各种
  • C++ 投掷类成员

    我有以下 C 代码 template
  • 查找数组中的重复元素?

    我看到一个面试题是这样的 数组中有一个数字重复 找到它 简单的解决方案如下 for int i 0 i
  • REST API 的试运行策略

    我正在寻找 REST API 的 试运行 操作的一些最佳实践 假设我有一个端点将资金从账户 A 转账到账户 B 我可以像这样发起转账 POST transactions amount 1000 how much to transfer so
  • jQuery 数据绑定 - 现在流行的插件是什么?

    我需要某种类型的 JS MVC DataBinding 解决方案 与实施 GMAIL Web 应用程序类似 消息索引和消息显示 在消息显示的位置 如果您修改消息 它会自动在消息索引中更新 我应该学习什么插件才能在不使用大量 jQuery 的
  • Tensorflow 中的入队和增量变量

    如何使张量流图将递 增的数字推送到队列 我这样做只是为了学习目的 所以我希望您保持它与我正在做的事情相似 并纠正我做错的事情 这是我的代码 import tensorflow as tf create queue queue tf Rand
  • 通过 attr_accessor 对模型对象进行排序

    当我必须对对象列表进行排序时 我认为 attr accessor 具有与另一个相同的行为 但似乎有所不同 dataRecords MyData where day Time now yesterday strftime Y m d to i
  • 仅禁用自动生成的表单上的特定“绿色加号”图标

    如何在自动生成的表单中禁用特定 manytomany 或 foreignkey 字段上的绿色图标 使用CSS如下 add another display none 禁用所有我不想要的 一个例子是工作日模型 存储从星期一到星期日的天数 指向该
  • Python 的多处理和内存

    我在用multiprocessing imap unordered对值列表执行计算 def process parallel fnc some list pool multiprocessing Pool for result in poo
  • 来自 Cordova iOS 插件的后续回调不会触发

    我在从 cordova 插件 iOS 插件 立即触发后续回调时遇到麻烦 在 XCode 调试器中 我清楚地看到它跳过了 self commandDelegate sendPluginResult pluginResult callbackI
  • ORA-01036: 通过 C# 运行查询时非法变量名称/编号

    我正在尝试使用ALTER USER在以下代码中 使用 C 中的 OracleCommand 查询 Oracle 数据库 如果用户名和密码的值不是空字符串 它将创建查询 但我收到一个错误 ORA 01036 illegal variable
  • 与带有分隔符的 String.Split 相反 (.net)

    有没有办法做相反的事情String Split在 Net 中 也就是说 用给定的分隔符组合数组的所有元素 Taking a b c 和给予 a b c 带有分隔符 UPDATE 我自己找到了答案 它是String Join method 找
  • 从 MS Excel 访问 Redis?

    我想使用 Redis 从命令行 脚本 Web 和电子表格中查询数据 除了电子表格之外 我可以找到很好的例子 不过 我不太知道从哪里开始访问 MS Excel 电子表格 谷歌让我失望了 请让我知道您建议如何执行此操作 谢谢 附注对于那些不熟悉
  • Spring MVC 请求映射

    我正处于学习使用 Spring MVC 的早期阶段 我创建了一个控制器并应用了RequestMapping对其进行注释 当我运行该项目时 索引页面按预期显示index htm 但是当我导航到应该指向我的控制器的 URI 时 我收到 404
  • 使用 HttpModule 进行本地化安全吗?

    我正在考虑使用 HttpModule 进行本地化 基于中的示例 本文 http weblogs manas com ar smedina 2008 12 17 internationalization in aspnet mvc 但我很好奇
  • Boost Beast 异步 Websocket 服务器 如何与会话交互?

    所以我不知道为什么 但我无法理解 boost Beast websocket 服务器以及如何 或应该 与其交互 我制作的基本程序看起来像这样 跨 2 个类 WebSocketListener and WebSocketSession htt
  • Java(Web 服务 - SOAP)- 如何在客户端添加 SOAP 处理程序并正确启用 MTOM?

    Java JDK 1 6 0 7 WSGEN 版本 JAX WS RI 2 2 3 b01 我有以下问题 SOAPBinding binding SOAPBinding BindingProvider port getBinding bin