Preprocesado de peticiones SOAP en JAX-WS

En el caso de que necesitemos establecer algún tipo de preprocesamiento/filtro/mecanismo de seguridad a un servicio web, una de las formas más interesantes es utilizando los manejadores HandlerChain que proporciona JAX-WS 2.x.

En primer lugar implementamos el manejador, que nos permitirá realizar procesamientos y postprocesamientos sobre las peticiones SOAP que lleguen a nuestro servicios web. Os dejo un ejemplo de un manejador que permite filtrar por ip:



public class SecurityServiceWebHandler  implements MessageHandler{

 private static Log log=LogFactory.getLog(SecurityServiceWebHandler.class);

 public Set getHeaders() {

 	return null;

 }

 public void close(MessageContext context) {

 }

 public boolean handleFault(MessageHandlerContext context) {

 	return true;

 } /** Comprueba que las ips que acceden a la aplicación son efectivamente ip permitidas.   * @see javax.xml.ws.handler.Handler#handleMessage(javax.xml.ws.handler.MessageContext)   */  public boolean handleMessage(MessageHandlerContext context) {   ServletRequest servletRequest = ((ServletRequest)context.get(MessageContext.SERVLET_REQUEST));   // Obtenemos la ip remota que invoca al Servicio Web   String remoteAddres=servletRequest.getRemoteAddr();   String allowed="192.168.10.160,80.58.0.12";   if(StringUtils.contains(allowed, remoteAddres)){   if(log.isInfoEnabled())log.info("Servicio Web solicitado desde ip: "+remoteAddres);   }else{   log.error("Acceso denegado. La ip "+remoteAddres+" no tiene permiso para acceder a los WS.");   throw new WebServiceException("Acceso denegado. La ip "+remoteAddres+" no tiene permiso para acceder a los WS.");   }   return true;  } }

Una vez implementado el manejador, lo siguiente es publicarlo en el fichero handlerchain.xml

<handler-chains xmlns=”http://java.sun.com/xml/ns/javaee”>
<handler-chain>
<handler>
<handler-class>org.viafirma.conector.security.SecurityServiceWebHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
El último paso es asociar nuestro servicio web con el manejador, mediante la anotación @HandlerChain.



@HandlerChain(file="handlerchain.xml")

@WebService(serviceName="ConectorFirmaRMIService",targetNamespace = "http://viafirma.org/client/", name = "ConectorFirmaRMIClient",portName="ConectorFirmaRMI",

endpointInterface = "org.viafirma.cliente.firma.rmi.FirmaClienteRMI")

public class ConectorFirmaRMI  extends UnicastRemoteObject implements FirmaClienteRMI {

Como ejemplo, gracias a este código podremos recuperar y registrar las ips de todas las peticiones entrantes a nuestro servicio web, y denegar las ips no admitidas.