У меня есть простое приложение JAX-WS Java командной строки для тестирования запроса 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», о котором вы говорите, - это «WSS-Password Type» на панели сведений о запросе. Это устанавливает безопасность WSS, а не HTTP.
При использовании JAX-WS в Java6 вам необходимо подключить SOAPHandler, чтобы вставить WSS-Usertoken в заголовок SOAP. В этой сети есть много деталей, но я не смог найти ни одной ссылки для публикации, поэтому вот какой-то код вместо этого, чтобы вы начали ...
Чтобы добавить обработчик, вам нужно что-то вроде:
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
}
Я сделал несколько предположений, но, надеюсь, это поможет вам!
С уважением.