I created a handler, based on the SimpleSession handler in the Axis code base (basically a simpler version) and configured it for my service. The handler only gets called before the pivot and therefore no session is returned. If I ignore the pivot and just set the session soap header it is not returne dto the client. How exactly should a server side handler be configured for a service so that it is invoked properly?
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration> <parameter name="adminPassword" value="admin"/> <parameter name="attachments.Directory" value="C:\java\tomcat-4.0.4\webapps\axis\WEB-INF\attachments"/> <parameter name="sendMultiRefs" value="true"/> <parameter name="sendXsiTypes" value="true"/> <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/> <parameter name="sendXMLDeclaration" value="true"/> <parameter name="axis.sendMinimizedElements" value="true"/> <requestFlow> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="session"/> </handler> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="request"/> <parameter name="extension" value=".jwr"/> </handler> </requestFlow> </globalConfiguration> <handler name="CountSession" type="java:com.xxx.ws.CountSessionHandler"/> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <service name="AdminService" provider="java:MSG"> <parameter name="allowedMethods" value="AdminService"/> <parameter name="enableRemoteAdmin" value="false"/> <parameter name="className" value="org.apache.axis.utils.Admin"/> <namespace>http://xml.apache.org/axis/wsdd/</namespace> </service> <service name="Version" provider="java:RPC"> <parameter name="allowedMethods" value="getVersion"/> <parameter name="className" value="org.apache.axis.Version"/> </service> <service name="Count" provider="java:RPC"> <operation name="add" qname="ns3:add" xmlns:ns3="urn:com.avaya.Count"> <parameter name="in0" type="xsd:int" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/> </operation> <requestFlow> <handler type="CountSession"/> </requestFlow> <parameter name="allowedMethods" value="add"/> <parameter name="wsdlPortType" value="Count"/> <parameter name="scope" value="Session"/> <parameter name="className" value="com.xxx.ws.CountSoapBindingImpl"/> <parameter name="wsdlServicePort" value="Count"/> <parameter name="wsdlTargetNamespace" value="urn:com.avaya.Count"/> <parameter name="wsdlServiceElement" value="CountService"/> </service> <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment> ---------------------------- package com.xxx.ws; import java.util.Hashtable; import javax.xml.namespace.QName; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.message.SOAPHeaderElement; import org.apache.axis.utils.Messages; public class CountSessionHandler extends BasicHandler { public static final String SESSION_ID = "AvayaSession.id"; public static final String SESSION_NS = "com.avaya.ws"; public static final String SESSION_LOCALPART = "sessionID"; public static final QName sessionHeaderName = new QName(SESSION_NS, SESSION_LOCALPART); private Hashtable activeSessions = new Hashtable(); private static long sessionId = 12345; public void invoke(MessageContext context) throws AxisFault { if (context.isClient() == true) { doClient(context); } else { doServer(context); } } public void doClient(MessageContext context) throws AxisFault { System.out.println( "client"); return; } public void doServer(MessageContext context) throws AxisFault { System.out.println( "Server"); if (context.getPastPivot() == true) { System.out.println( "server response"); // This is a response. Add the session header if we have an // ID. Long id = (Long) context.getProperty(SESSION_ID); if (id == null) return; Message msg = context.getResponseMessage(); if (msg == null) return; SOAPEnvelope env = msg.getSOAPEnvelope(); SOAPHeaderElement header = new SOAPHeaderElement(SESSION_NS, SESSION_LOCALPART, id); env.addHeader(header); } else { System.out.println( "server request "); // Request. Set up the session if we find the header. Message msg = context.getRequestMessage(); if (msg == null) throw new AxisFault(Messages.getMessage("noRequest00")); SOAPEnvelope env = msg.getSOAPEnvelope(); SOAPHeaderElement header = env.getHeaderByName(SESSION_NS, SESSION_LOCALPART); Long id; if (header != null) { // Got one! try { id = (Long) header.getValueAsType(Constants.XSD_LONG); } catch (Exception e) { throw AxisFault.makeFault(e); } } else { id = getNewSession(); } context.setProperty(SESSION_ID, id); } } private synchronized Long getNewSession() { sessionId++; return (new Long(sessionId)); } }
