java - JAX-WS 密码类型 PasswordText

标签 java soap jax-ws wsse

我有一个简单的命令行 Java JAX-WS 应用程序来测试 SOAP 请求,但服务器期望密码类型为 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);
        ...

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

谢谢。

最佳答案

这将为基本 HTTP 身份验证设置用户名和密码。如果您在 SoapUI 中对其进行了测试,我猜您所说的“PasswordText”值是请求详细信息 Pane 中的“WSS-Password Type”。这设置了 WSS 安全性,而不是 HTTP 安全性。

使用 Java6 中的 JAX-WS,您需要附加一个 SOAPHandler 以将 WSS-Usertoken 注入(inject) SOAP Header。网上有很多关于这个圈子的东西,但我找不到一个可以发布的链接,所以这里有一些代码可以让你继续......

要添加处理程序,您需要以下内容:

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 类将执行此操作。处理程序是通用的东西,会为成功的消息和错误的消息而调用,但也许更重要的是,它们会在 both 消息方向上调用 - 用于传出请求,然后再次用于传入响应。您只想处理传出消息。所以你需要这样的东西:

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
}

我在这里做了一些假设,但希望它能让你继续前进!

亲切的问候。

关于java - JAX-WS 密码类型 PasswordText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3096183/

相关文章:

java - LibGDX:如何绘制透明多边形?

java - 与 Jetty 和 Guice 集成良好的 Web 服务 Java 库?

java - Salesforce SOAP api 客户端 ID

java - JAX-WS 调度请求设置内容类型

jax-ws - Apache CXF JAX-RS 服务缺少 XML 文档启动

java - 使用 <a href> 链接到 servlet

java - Luaj 尝试索引? (一个函数值)

java - 如何将一个大序列文件拆分为多个序列文件?

java - 将 XML 声明添加到 soap 消息

web-services - 无法在 jBOSS 5.1 中部署示例 Web 服务