当我拥有的是wsdl时,如何处理WS-Security?

时间:2010-11-14 18:41:43

标签: wsdl jax-ws ws-security webservice-client java-metro-framework

我正在尝试开发一个在Glassfish容器(Metro)中使用Web服务的独立客户端应用程序。关于我必须工作的所有东西都是我想要使用的wervices的wsdl。 wsdl充斥着各种'wsp:Policy'标签。看起来像IssuedToken,Trust13,ecryption都被使用了。 所以我从netbeans和JAX-WS生成了一些代码。一切顺利,但在尝试运行客户端时,我得到: 'WST0029:无法从IssuedToken或客户端配置获取STS位置以访问服务http://localhost:8080/ ....'

当我发现我对WSS一无所知时。它看起来不像生成任何代码来处理安全性。所以,我必须从头开始。 那么从哪里开始呢?图书?教程?

TIA

1 个答案:

答案 0 :(得分:2)

Metro在运行时从WSDL或wsit-client.xml配置文件应用策略。这就是为什么没有生成与策略相关的代码的原因。根据{{​​3}},目前不可能以编程方式进行。

this post很好地解释了你可以用WSS做的一些事情,尽管在这种情况下一切都可能不适用,但它仍然是一个很好的阅读。

我发现生成具有WSS支持的客户端的最简单方法是使用Metro的wsimport脚本:

cd metro/bin/
mkdir src target
./wsimport.sh -s src -d target -extension -Xendorsed -verbose YourService.wsdl

然后将Metro安装到您的应用程序服务器中(将库复制到正确的位置或运行ant脚本):

ant -f metro-on-glassfish.xml

然后将您的本地WSDL文件放在类路径中(例如资源文件夹),以便Metro可以在运行时获取它以应用生成的YourService类中的策略:

private final static URL YOURSERVICE_WSDL_LOCATION;

// This is enough, you don't need the wsdlLocation attribute 
// on the @WebServiceClient annotation if you have this.
static {
    YOURSERVICE_WSDL_LOCATION =
        CustomerService.class.getClassLoader().getResource("YourService.wsdl");
}

public YourService() {
    super(YOURSERVICE_WSDL_LOCATION, 
            new QName("http://tempuri.org/", "YourService"));
}

如果你想要This tutorial,你可能需要手动为你的绑定方法添加这个功能(Metro从来没有为我生成过,所以我总是要自己添加它。)

@WebEndpoint(name = "WSHttpBinding_IYourService")
public IYourService getWSHttpBindingIYourService() {
    WebServiceFeature wsAddressing = new AddressingFeature(true);

    IYourService service =
        super.getPort(new QName("http://xmlns.example.com/services/Your",
                "WSHttpBinding_IYourService"), IYourService.class, 
                wsAddressing);

    return service;
}