java JAX-WS 客户端基本认证
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10740367/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JAX-WS Client Basic Authentication
提问by Bryce Fischer
I'm being forced to remove CXF from my web service. To remove any dependencies on the authentication, I had setup an HttpAuthSupplier class to handle basic authentication.
我被迫从我的网络服务中删除 CXF。为了消除对身份验证的任何依赖,我设置了一个 HttpAuthSupplier 类来处理基本身份验证。
public class ExchangeAuthSupplier implements HttpAuthSupplier{
@Override
public boolean requiresRequestCaching() {
return false;
}
@Override
public String getAuthorization(AuthorizationPolicy authPolicy, URL url, Message message, String fullHeader) {
// Lookup authentication information and return appropriate header
}
}
What I'm trying to figure out how I can do something similar using regular JAX-WS API and Spring...
我想弄清楚如何使用常规 JAX-WS API 和 Spring 做类似的事情......
回答by Bryce Fischer
To answer my own question... I decided to go with using Handlers. So I created a SOAPHandler similar to ExchangeAuthSupplier above:
回答我自己的问题......我决定使用处理程序。所以我创建了一个类似于上面 ExchangeAuthSupplier 的 SOAPHandler:
public class MyAuthenticationHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
final Boolean outInd = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outInd.booleanValue()) {
try {
UserNamePasswordPair userNamePasswordPair = getAuthorization(); // Method to retrieve credentials from somewhere
context.put(BindingProvider.USERNAME_PROPERTY, userNamePasswordPair.getUsername());
context.put(BindingProvider.PASSWORD_PROPERTY, userNamePasswordPair.getPassword());
} catch (final Exception e) {
return false;
}
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
logger.error("error occurred when getting auth.");
return false;
}
@Override
public void close(MessageContext context) {
logger.debug("closing handler for auth...");
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
Created a HandlerResolver to add the resolvers to a chain:
创建了一个 HandlerResolver 以将解析器添加到链中:
public class MyHandlerResolver implements HandlerResolver {
private List<Handler> chain;
public MyHandlerResolver() {
chain = new ArrayList<Handler>();
chain.add(new MyAuthenticationHandler();
}
@Override
public List<Handler> getHandlerChain(PortInfo portInfo) {
return chain;
}
}
And then in Spring, just hooked it all up like this:
然后在 Spring 中,像这样将其全部连接起来:
<bean id="myJAXWSClient" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="Interface to implement"/>
<property name="wsdlDocumentUrl" value="classpath:/wsdl/theWsdl.wsdl"/>
<property name="namespaceUri" value="namespace"/>
<property name="serviceName" value="ServiceName"/>
<property name="endpointAddress" value="/endpoint"/>
<property name="handlerResolver" ref="myHandlerResolver"/>
</bean>
<bean id="myHandlerResolver" class="com.mystuff.ExchangeHandlerResolver"/>
回答by Pawe? Kaczorowski
For Basic auth and Spring's JaxWsPortProxyFactoryBean you can simply use:
对于基本身份验证和 Spring 的 JaxWsPortProxyFactoryBean,您可以简单地使用:
<bean id="myJAXWSClient" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="Interface to implement"/>
<property name="wsdlDocumentUrl" value="classpath:/wsdl/theWsdl.wsdl"/>
<property name="namespaceUri" value="namespace"/>
<property name="serviceName" value="ServiceName"/>
<property name="endpointAddress" value="/endpoint"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
回答by Arun Christopher
Adding to kaczors answer for Basic authentication with Spring's JaxWsPortProxyFactoryBean, if the wsdl or xsd is not in the classpath and need to be accessed from an url which requires basic authentication, create a custom JaxWsPortProxyFactoryBean which will enable WSDL url http basic authentication.
添加到使用 Spring 的 JaxWsPortProxyFactoryBean 进行基本身份验证的 kaczors 答案中,如果 wsdl 或 xsd 不在类路径中并且需要从需要基本身份验证的 url 访问,请创建一个自定义 JaxWsPortProxyFactoryBean,它将启用 WSDL url http 基本身份验证。
public class CustomJaxWsPortProxyFactoryBean extends JaxWsPortProxyFactoryBean {
公共类 CustomJaxWsPortProxyFactoryBean 扩展 JaxWsPortProxyFactoryBean {
@Override
public Service createJaxWsService() {
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
getUsername(),
getPassword().toCharArray());
}
});
return super.createJaxWsService();
}
Thanks to sundaramss of spring forums
感谢spring 论坛的sundaramss