WedX - журнал о программировании и компьютерных науках

удаление атрибута mustUnderstand из заголовков мыла

Как удалить атрибут mustunderstand из заголовка мыла в клиенте оси. Даже я не устанавливаю его специально, когда я устанавливаю информацию о заголовке мыла mustundertand, а атрибуты актера автоматически добавляются в сообщение мыла. Кто-нибудь знает, как их удалить? Я использую wsdl2java версии Axis2 1.4 для создания моего клиента ws.

19.09.2011

Ответы:


1

Ни одно из этих решений не сработало для меня, так как:

  • Я работаю с Axis (не Axis2)
  • Я вообще не хочу, чтобы этот атрибут указывался, так как мой аналог на сервере его не поддерживает ("https://schemas.xmlsoap.org/soap/envelope/:mustUnderstand «атрибут не объявлен» — типичный ответ в таком случае).

Глядя на ответ на "Добавление ws-security в сгенерированные классы wsdl2java" помог мне написать решение, которое сработало для меня:

void addSecurityHeader(Stub stub, final String username, final String password) {
  QName headerName = new QName("https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");  // Or any other namespace that fits in your case
  AtomicReference<SOAPHeaderElement> header 
    = new AtomicReference<SOAPHeaderElement>
        (new SOAPHeaderElement(headerName) {                       
           {  
             SOAPElement utElem = addChildElement("UsernameToken");
             utElem.addChildElement("Username").setValue(username);
             utElem.addChildElement("Password").setValue(password);
           }
           @Override
           public void setAttribute(String namespace, String localName, String value) {
             if (!Constants.ATTR_MUST_UNDERSTAND.equals(localName)) {  // Or any other attribute name you'd want to avoid
               super.setAttribute(namespace, localName, value);
             }
           }
        });
  SOAPHeaderElement soapHeaderElement = header.get();
  soapHeaderElement.setActor(null);      // No intermediate actors are involved.
  stub.setHeader(soapHeaderElement);  // Finally, attach the header to the stub
}
11.04.2013
  • спасает мне жизнь... спасибо 26.12.2013
  • Это сработало отлично! Спасибо. Мне не нужны были дочерние узлы, поэтому я использовал это: new SOAPHeaderElement(headName) { { setValue(value); } 13.05.2014
  • Спасибо! Это следует принять как правильный ответ на этот вопрос. Класс SOAPHeaderElement по умолчанию добавляет атрибуты mustUnderstand и Actor в заголовок, и это (пока) единственный способ удалить его, фильтруя добавление/установку в первую очередь. 06.01.2017

  • 2

    Если вы хотите отключить проверку необходимости понимания в клиенте AXIS, вам нужно добавить в свой код следующую строку:

    _call.setProperty(Call.CHECK_MUST_UNDERSTAND, new Boolean(false));
    

    то MustUnderstandChecker клиента AXIS никогда не вызывается.

    02.08.2012

    3

    В моем случае сработало удаление атрибута из SOAPHeader вручную.

    SOAPHeader header = env.getHeader();
    OMChildrenQNameIterator childrenWithName = (OMChildrenQNameIterator) header.getChildrenWithName(omElementauthentication.getQName());
        while (childrenWithName.hasNext()) {
            org.apache.axiom.om.OMElement omElement = (org.apache.axiom.om.OMElement) childrenWithName.next();
            QName mustAnderstandQName = omElement.resolveQName("soapenv:mustUnderstand");
            if (mustAnderstandQName == null) {
                continue;
            }
            OMAttribute mustAnderstandAttribute = omElement.getAttribute(mustAnderstandQName);
                if (mustAnderstandAttribute == null) {
                    continue;
                }
            omElement.removeAttribute(mustAnderstandAttribute);
        }
    
    20.08.2014

    4

    Недавно я боролся с подобной ситуацией, и, погуглив, мне удалось найти следующее решение.

    Используя Axis2, вы, вероятно, создали бы файл MyWSStub, содержащий вызовы вашей службы. Создайте класс-оболочку (лучше не трогать автоматически сгенерированные файлы-заглушки), который расширяет вашу заглушку, например. MyWSStubWrapper:

    public class MyWSStubWrapper extends MyWSStub {
    
    /**
     * @throws AxisFault
     */
    public MyWSStubWrapper() throws AxisFault {
    }
    
    /**
     * @param configurationContext
     * @throws AxisFault
     */
    public MyWSStubWrapper(ConfigurationContext configurationContext) throws AxisFault {
        super(configurationContext);
    }
    
    /**
     * @param targetEndpoint
     * @throws AxisFault
     */
    public MyWSStubWrapper(String targetEndpoint) throws AxisFault {
        super(targetEndpoint);
    }
    
    /**
     * @param configurationContext
     * @param targetEndpoint
     * @throws AxisFault
     */
    public MyWSStubWrapper(ConfigurationContext configurationContext, String targetEndpoint) throws AxisFault {
        super(configurationContext, targetEndpoint);
    }
    
    /**
     * @param configurationContext
     * @param targetEndpoint
     * @param useSeparateListener
     * @throws AxisFault
     */
    public MyWSStubWrapper(ConfigurationContext configurationContext, String targetEndpoint, boolean useSeparateListener) throws AxisFault {
        super(configurationContext, targetEndpoint, useSeparateListener);
    }
    
    @Override
    protected void addHeader(OMElement omElementToadd, SOAPEnvelope envelop, boolean mustUnderstand) {
        SOAPHeaderBlock soapHeaderBlock = envelop.getHeader().addHeaderBlock(omElementToadd.getLocalName(), omElementToadd.getNamespace());
        OMNode omNode = null;
    
        // add child elements
        for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();) {
            omNode = (OMNode) iter.next();
            iter.remove();
            soapHeaderBlock.addChild(omNode);
        }
    
        OMAttribute omatribute = null;
        // add attributes
        for (Iterator iter = omElementToadd.getAllAttributes(); iter.hasNext();) {
            omatribute = (OMAttribute) iter.next();
            soapHeaderBlock.addAttribute(omatribute);
        }
    }
    

    }

    Имейте в виду, что приведенный выше код полностью удалит soapenv:mustUnderstand="0|1" из ваших заголовков, если вы хотите добавить, вам нужно вызвать soapHeaderBlock.setMustUnderstand(true|false); где-то в вашем коде.

    10.04.2013

    5

    1) Используете ли вы Axis SOAPHeaderElement, и если да, устанавливаете ли вы для установщика mustUnderstand значение false?

    2) Поскольку вы создаете свой клиент с помощью wsdl2java, вполне возможно, что WSDL (или, точнее, схема) содержит атрибут mustUnderstand для элемента, на который ссылается ваша привязка SOAP. Поэтому, когда wsdlToJava генерирует клиентский код, эти атрибуты будут добавлены естественным образом. См. здесь описание атрибут mustUnderstand. Если об изменении WSDL не может быть и речи, и вы должны удалить этот атрибут из заголовка, то я полагаю, вы можете попробовать сделать это с помощью обработчика

    3) Не рекомендуется, но если вы действительно ДОЛЖНЫ удалить этот атрибут, я полагаю, вы можете добавить обработчик на стороне клиента, который изменяет заголовок: https://ws.apache.org/axis/java/apiDocs/org/apache/axis/handlers/package-summary.html

    19.09.2011
  • 1) Да, я использую SOAPHeaderElement, но я пробовал как без установки mustunderstand, так и с установкой значения false. На самом деле ничего не изменилось. мой код выглядит следующим образом: заголовок SOAPHeaderElement = новый SOAPHeaderElement (ns1://x.x.x.x/abc.asmx, AuthHeader); Узел SOAPElement = header.addChildElement(user_1); node.addTextNode(abc); SOAPElement node2 = header.addChildElement(pass_1); node2.addTextNode(123); _call.addHeader (заголовок); 19.09.2011
  • Когда вы говорите, что ничего не изменилось, вы имеете в виду, что заголовок SOAP всегда отображается с mustUnderstand=false? У вас есть WSSDL/схема, которую вы могли бы опубликовать (не публикуйте все это, если оно очень длинное... только соответствующие разделы). 19.09.2011
  • да, я имею в виду именно это. Я думаю, что коды осей добавляют свойства mustunderstand и актера в поведение по умолчанию, когда установлен параметр заголовка мыла. Когда я удаляю код для заголовка мыла, чем mustunderstand, и параметры актера также удаляются. 20.09.2011
  • связанная часть wsdl может быть ‹wsdl:operation name=xMethod› ‹soap:operation soapAction=xxxx/Bank.asmx/xMethod style=document /› ‹wsdl:input› ‹soap:body use=literal /› ‹soap:header message=tns:AuthHeader part=AuthHeader use=literal /› ‹/wsdl:input› ‹wsdl:output › ‹soap:body use=literal /› ‹/wsdl:output› ‹/wsdl:operation› 20.09.2011

  • 6

    я использую клиент оси 1.4 с безопасностью ws

    в моем случае, как сказал Рейнхард, это сработало

    MyService service = new MyServiceLocator(); 
    MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint();
    
    ((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);
    
    28.01.2013
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]