java - 使用 UsernameToken(SOAP 安全 header )保护 WS 客户端

标签 java web-services jax-ws

我正在尝试确保我的 WS 客户端能够调用 WS。
我的代码如下所示:

            SendSmsService smsService = new SendSmsService();
SendSms sendSMS = smsService.getSendSms();  
BindingProvider stub = (BindingProvider)sendSMS;

//Override endpoint with local copy of wsdl.
String URL ="";//here is the wsdl url
Map<String,Object> requestContext = stub.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, URL);

//Set usernametoken
URL fileURL = loader.getResource("client-config.xml");
File file = new File(fileURL.getFile());

FileInputStream clientConfig = null;
try {
 clientConfig = new FileInputStream(file);
} catch (FileNotFoundException e) {
 e.printStackTrace();
}

XWSSecurityConfiguration config = null;
try {
 config = SecurityConfigurationFactory.newXWSSecurityConfiguration(clientConfig);
} catch (Exception e) {
 e.printStackTrace();
 log.warn("Exception: "+e.getMessage());
}
requestContext.put(XWSSecurityConfiguration.MESSAGE_SECURITY_CONFIGURATION, config);

//Invoke the web service

 String requestId = null;
 try {
  requestId = sendSMS.sendSms(addresses, senderName, charging, message,   receiptRequest);
 } catch (PolicyException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (ServiceException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

配置文件如下所示:

<xwss:JAXRPCSecurity xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"   optimize="true">
 <xwss:Service>
  <xwss:SecurityConfiguration dumpMessages="true"
   xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
    <xwss:UsernameToken name="username" password="password>
  </xwss:SecurityConfiguration>
 </xwss:Service>
 <xwss:SecurityEnvironmentHandler>
  util.SecurityEnvironmentHandler
</xwss:SecurityEnvironmentHandler>
</xwss:JAXRPCSecurity>

SecurityEnviromentHandler 是一个实现 javax.security.auth.callback.CallbackHandler 的虚拟类。

身份验证必须符合 Oasis Web 服务安全用户名 token 配置文件 1.0。
但我不断收到“安全 header 无效”错误。
我哪里错了,谁能告诉我。
我使用 wsimport(JAX_WS 2.1 为我的客户端生成类)
注意:关于这个 WS,我只知道 WSDL URL 和 user&pass 用于身份验证

最佳答案

解决方案
我解决了这个问题。出错的地方是 client-config.xml 文件,因为我不知道如何正确设置它。我遇到了这个例子并使用了它:
http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client
只需将链接上的这两个类复制到我的项目结构中并调用它们,如下所示:

SendSmsService smsService = new SendSmsService();
HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();
smsService.setHandlerResolver(handlerResolver);
SendSms sendSMS = smsService.getSendSms();

现在它完美运行了!

关于java - 使用 UsernameToken(SOAP 安全 header )保护 WS 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4593674/

相关文章:

java - 需要有关梯形规则 Java 代码的帮助

.net - 记录 ASP.NET MVC 性能指标

web-services - 如何使用 Visual Studio 2010 创建 Web 服务负载测试?

java - Android:将数据从java发送到php文件并有响应

java - Java中的最终静态变量是线程安全的吗?

JAX-WS:如何在继承的响应对象(WS 响应)中排除 "member/field"?

java - 推荐使用 Moxy 的 JAX-WS 框架

java - 从 soap 响应中移除 <return> 元素 - JaxWs

java - 如何使用 JRuby 正确打包?

android - 如何将本地主机 SOAP web 服务连接到我的 android