首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JAX-WS密码类型PasswordText

JAX-WS密码类型PasswordText
EN

Stack Overflow用户
提问于 2010-06-23 02:48:53
回答 1查看 32.5K关注 0票数 22

我有一个简单的命令行Java JAX-WS应用程序来测试SOAP请求,但服务器希望密码类型为PasswordText,而我在如何设置它方面遇到了困难……

代码如下所示:

代码语言:javascript
复制
@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);
        ...

我已经使用SOAP-UI测试了该请求,因此我知道它正在工作。任何有关设置密码类型的帮助都将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-25 20:10:51

这将设置基本HTTP身份验证的用户名和密码。如果你在SoapUI中测试过它,我猜你提到的'PasswordText‘值就是请求详细信息窗格中的'WSS-Password Type’。它设置WSS安全性,而不是HTTP安全性。

对于Java6中的JAX-WS,您需要附加一个SOAPHandler来将WSS-Usertoken注入到SOAP头中。网上有很多关于这方面的信息,但我找不到一个可以发布的链接,所以这里有一些代码来帮助你……

要添加处理程序,您需要执行以下操作:

代码语言:javascript
复制
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类将执行此操作。处理程序是通用的东西,成功的消息和错误的消息都会调用它们,但可能更重要的是,它们在两个消息方向上都会被调用-对于传出的请求,然后再次调用传入的响应。您只想处理传出消息。所以你需要类似这样的东西:

代码语言:javascript
复制
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
}

我在这里做了一些假设,但希望它能让你振作起来!

致以亲切的问候。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3096183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档