Java 在SOAP标头请求中添加元素以进行身份验证
我需要在我的新web服务中包含一个身份验证头(即作为SOAP头请求的一部分)。该身份验证标头将验证用户ID和密码详细信息。我必须在Web服务中验证用于身份验证的请求头详细信息的内容。如果经过身份验证,则将处理请求的SOAP主体,否则Web服务将向调用该服务的客户端应用程序发回无效的身份验证消息 我无法理解如何创建一个web服务,其中SOAP头将包含一些元素(在我的例子中是身份验证元素,如userId和password) 通常,服务中公开的任何方法都将作为SOAP主体的一部分。因此,我们对如何在SOAP头中添加身份验证元素感到困惑 请帮忙Java 在SOAP标头请求中添加元素以进行身份验证,java,xml,web-services,soap,soapheader,Java,Xml,Web Services,Soap,Soapheader,我需要在我的新web服务中包含一个身份验证头(即作为SOAP头请求的一部分)。该身份验证标头将验证用户ID和密码详细信息。我必须在Web服务中验证用于身份验证的请求头详细信息的内容。如果经过身份验证,则将处理请求的SOAP主体,否则Web服务将向调用该服务的客户端应用程序发回无效的身份验证消息 我无法理解如何创建一个web服务,其中SOAP头将包含一些元素(在我的例子中是身份验证元素,如userId和password) 通常,服务中公开的任何方法都将作为SOAP主体的一部分。因此,我们对如何在S
关于,最近,我编写了一个类,将用户凭据添加到
SOAP
头中。为此,您需要创建一个实现SOAPHandler
接口的类。例如:
public class MyHandler implements SOAPHandler<SOAPMessageContext> {
private static final Logger LOGGER = LoggerFactory.getLogger(MyHandler.class);
private String username;
private String password;
/**
* Handles SOAP message. If SOAP header does not already exist, then method will created new SOAP header. The
* username and password is added to the header as the credentials to authenticate user. If no user credentials is
* specified every call to web service will fail.
*
* @param context SOAP message context to get SOAP message from
* @return true
*/
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
SOAPMessage message = context.getMessage();
SOAPHeader header = message.getSOAPHeader();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
if (header == null) {
header = envelope.addHeader();
}
QName qNameUserCredentials = new QName("https://your.target.namespace/", "UserCredentials");
SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials);
QName qNameUsername = new QName("https://your.target.namespace/", "Username");
SOAPHeaderElement username = header.addHeaderElement(qNameUsername );
username.addTextNode(this.username);
QName qNamePassword = new QName("https://your.target.namespace/", "Password");
SOAPHeaderElement password = header.addHeaderElement(qNamePassword);
password.addTextNode(this.password);
userCredentials.addChildElement(username);
userCredentials.addChildElement(password);
message.saveChanges();
//TODO: remove this writer when the testing is finished
StringWriter writer = new StringWriter();
message.writeTo(new StringOutputStream(writer));
LOGGER.debug("SOAP message: \n" + writer.toString());
} catch (SOAPException e) {
LOGGER.error("Error occurred while adding credentials to SOAP header.", e);
} catch (IOException e) {
LOGGER.error("Error occurred while writing message to output stream.", e);
}
return true;
}
//TODO: remove this class after testing is finished
private static class StringOutputStream extends OutputStream {
private StringWriter writer;
public StringOutputStream(StringWriter writer) {
this.writer = writer;
}
@Override
public void write(int b) throws IOException {
writer.write(b);
}
}
@Override
public boolean handleFault(SOAPMessageContext context) {
LOGGER.debug("handleFault has been invoked.");
return true;
}
@Override
public void close(MessageContext context) {
LOGGER.debug("close has been invoked.");
}
@Override
public Set<QName> getHeaders() {
LOGGER.debug("getHeaders has been invoked.");
return null;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
但是它也可以在
端点上实现
我们只能从信封中获取标题,而不是从soap消息中获取标题。是的,它来自javax.xml.ws.handler.soap包。我不知道它是否适用于JAX-RPC,我只在JAX-WS中使用过它。您应该试试看它是否有效:)下面是您应该阅读的关于IBM的JAX-RPC处理程序的链接:如果您有一个处理程序,并且可以将消息接收到该处理程序中,这意味着您可以对消息执行任何操作。您只需要了解如何修改RPC样式的消息。下面是通过JAX-RPC实现的示例:我对RPC一无所知,因为我没有使用过它。我建议你考虑一下Apache CXF:它是最新的web服务堆栈。它基于JAX-WS,但还有很多其他功能,这些功能有时非常有用。JAX-WS的解决方案是注释java参数:@XmlElement(required=true)。但我不知道JAX-RPCCan有人看这个吗?
<bean id="soapHandler" class="your.package.MyHandler">
<property name="username" value="testUser"/>
<property name="password" value="testPassword"/>
</bean>
<jaxws:client "...">
<jaxws:handlers>
<ref bean="soapHandler"/>
</jaxws:handlers>
</jaxws:client>