定义以透明方式拦截所有服务的全局JAX-WS MessageHandler,可以通过以下步骤实现:
javax.xml.ws.handler.MessageHandler
接口的类,并实现其中的方法,例如handleMessage
、close
等。import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.MessageHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import javax.xml.soap.SOAPMessage;
public class MyGlobalMessageHandler implements MessageHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext messageContext) {
// 在此处实现拦截逻辑
return true;
}
@Override
public void close(MessageContext messageContext) {
// 在此处实现关闭逻辑
}
}
MessageHandler
实例。import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;
import java.util.ArrayList;
import java.util.List;
public class MyHandlerResolver implements HandlerResolver {
@Override
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerChain = new ArrayList<>();
handlerChain.add(new MyGlobalMessageHandler());
return handlerChain;
}
}
HandlerResolver
实例注册到服务端点。import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args) {
Endpoint endpoint = Endpoint.create(new MyService());
endpoint.setHandlerResolver(new MyHandlerResolver());
endpoint.publish("http://localhost:8080/myservice");
}
}
HandlerResolver
实例注册到客户端代理。import javax.xml.ws.Service;
import javax.xml.ws.handler.HandlerResolver;
public class MyClient {
public static void main(String[] args) {
MyService service = new MyService();
MyServicePortType port = service.getMyServicePort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getBinding().setHandlerChain(new MyHandlerResolver().getHandlerChain(null));
}
}
通过以上步骤,可以实现以透明方式拦截所有服务的全局JAX-WS MessageHandler。在MyGlobalMessageHandler
类中,可以实现拦截逻辑,例如对SOAP消息进行加密、签名、验证等操作。
领取专属 10元无门槛券
手把手带您无忧上云