سؤال

لدي سطر أوامر بسيطة جافا جاكس-WS التطبيق لاختبار الصابون الطلب ، ولكن الخادم ينتظر كلمة السر نوع PasswordText وأنا الحيرة في كيفية وضع هذا...

تبدو التعليمة البرمجية كما يلي:

@WebServiceRef
private static final HelloService helloService = new HelloService(url, new QName(
        URL, "HelloService"));

public static void main(final String... args) {

    try {
        final HelloPort helloPort = helloService.getHelloPort();
        final BindingProvider hB = ((BindingProvider) helloPort);
        hB.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                                   END_POINT_ADDRESS);
        hB.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
                                   USERNAME);
        hB.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
                                   PASSWORD);
        ...

لقد اختبرت طلب استخدام الصابون-واجهة المستخدم إذا كنت لا تعرف انها العامل.أي مساعدة في إعداد كلمة المرور اكتب سيكون موضع تقدير.

شكرا

هل كانت مفيدة؟

المحلول

أنه سيتم تعيين اسم المستخدم وكلمة المرور للمصادقة HTTP الأساسية.إذا كنت قد اختبرت ذلك في صوابي يسمح انا التخمين 'PasswordText قيمة تتحدث عنه هو 'WSS-اكتب كلمة المرور' في طلب جزء التفاصيل.أن مجموعات WSS الأمن ، وليس HTTP الأمن.

مع جاكس-WS في Java6 تحتاج إلى إرفاق SOAPHandler لحقن WSS-Usertoken في الصابون رأس.هناك الكثير من بت والبوب عن هذه الجولة شبكة الإنترنت, ولكن أنا لا يمكن العثور على واحد رابط واحد إلى آخر, حتى هنا بعض التعليمات البرمجية بدلا من ذلك تحصل على الذهاب...

إضافة معالج تحتاج شيئا مثل:

final Binding binding = ((BindingProvider) servicePort).getBinding();
List<Handler> handlerList = binding.getHandlerChain();
if (handlerList == null)
    handlerList = new ArrayList<Handler>();

handlerList.add(new SecurityHandler());
binding.setHandlerChain(handlerList); // <- important!

ثم SecurityHandler الدرجة سوف تفعل الفعل.معالجات الأشياء العامة و الحصول على استدعاء لكل ناجح رسائل أخطاء ، ولكن ربما الأهم من ذلك أنها تحصل على ما يسمى في سواء رسالة الاتجاهات - المنتهية ولايته الطلب ثم مرة أخرى واردة الاستجابة.كنت ترغب فقط في التعامل مع الرسائل الصادرة.لذلك عليك شيء من هذا القبيل:

public final class SecurityHandler implements SOAPHandler<SOAPMessageContext> {

    ...

    @Override
    public boolean handleMessage(final SOAPMessageContext msgCtx) {

        // Indicator telling us which direction this message is going in
        final Boolean outInd = (Boolean) msgCtx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        // Handler must only add security headers to outbound messages
        if (outInd.booleanValue()) {
            try {
                // Get the SOAP Envelope
                final SOAPEnvelope envelope = msgCtx.getMessage().getSOAPPart().getEnvelope();

                // Header may or may not exist yet
                SOAPHeader header = envelope.getHeader();
                if (header == null)
                    header = envelope.addHeader();

                // Add WSS Usertoken Element Tree 
                final SOAPElement security = header.addChildElement("Security", "wsse",
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                final SOAPElement userToken = security.addChildElement("UsernameToken", "wsse");
                userToken.addChildElement("Username", "wsse").addTextNode("MyWSSUsername");
                userToken.addChildElement("Password", "wsse").addTextNode("MyWSSPassword");

            } catch (final Exception e) {
                LOG.error(e);
                return false;
            }
        }
        return true;
    }

    ...
    // Other required methods on interface need no guts
}

لقد قدمت بعض الافتراضات هنا, ولكن نأمل أنها سوف تحصل على الذهاب!

مع أطيب التحيات.

نصائح أخرى

إذا قمت بتنفيذ واجهة Soaphandler ، فستقوم الطريقة msgctx.getMessage () بتقديم XML بأكمله ، وإذا كنت تعمل مع ملفات كبيرة ، فستكون لديك أخطاء في الذاكرة. لقد اختبرت مع مصادقة usernametoken على عميل Jax-WS وهو يعمل:

String SECURITY_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
String PASSWORD_TYPE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";
String AUTH_PREFIX = "wss";

MyService service = new MyService();
MyServicePort port = service.getMyServicePort();

try {
    SOAPFactory soapFactory = SOAPFactory.newInstance();
    SOAPElement security = soapFactory.createElement("Security", AUTH_PREFIX, SECURITY_NS);
    SOAPElement uToken = soapFactory.createElement("UsernameToken", AUTH_PREFIX, SECURITY_NS);
    SOAPElement username = soapFactory.createElement("Username", AUTH_PREFIX, SECURITY_NS);
    username.addTextNode("username");

    SOAPElement pass = soapFactory.createElement("Password", AUTH_PREFIX, SECURITY_NS);
    pass.addAttribute(new QName("Type"), PASSWORD_TYPE);
    pass.addTextNode("password");

    uToken.addChildElement(username);
    uToken.addChildElement(pass);
    security.addChildElement(uToken);

    Header header = Headers.create(security);
    ((WSBindingProvider) port).setOutboundHeaders(header);

    // now, call webservice

} catch (SOAPException ex) {
    ex.printStackTrace();
}

يحرر: يجب عليك إضافة "RT.JAR" من JRE إلى ClassPath.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top