|
Yes,
thank�s a lot Oliver, it works !!!
Regards
Sven
PS.:
It�s funny, that in all the mails and examples related to the topic there is no
hint how you can solve the problem really (see above) ...
Hi Sven,
here is the extra code:
import
org.apache.axis.utils.SessionUtils;
...
SessionUtils session = new
SessionUtils();
call.setProperty( "SimpleSession.id",
session.generateSession());
For our project I changed the simple session handler.
For use the handler creates the session id.
BTW: be careful with the SIMPLE session handler. Its
really simple ! (failover, multiple axis instances, ...)
Regards
Oliver
-----Urspr�ngliche Nachricht-----
Von: Sven Dilsen [mailto:[EMAIL PROTECTED]] Gesendet: Di
11.02.2003 9.43 Uhr An: '[EMAIL PROTECTED]' Cc:
Betreff: AW: sessions and client config
Thanks,
but how can I do that ? A litte example which shows what extra steps
are necessary would be helpful.
Regards
Sven
Hi,
the simple session handler adds the session id
only if there exists the right property in MessageContext. If this
property doesn't exists the session header will not be craeted.
Hi,
I fiddled around with session management in
Axis for a few days now and I encountered some problems, mainly related
to the client configuration. The following explanation is quite long
but I think necessary to get the whole
background.
OK
First I tested the example
test.session.TestSimpleSession and it worked fine.
Then I tried
to make my service session enabled, adding a method that works more or
less similar to the one in the example (just for testing purposes). The
server part is generated with the Java2WSDL and WSDL2Java tools and
I added the SimpleSessionHandler to the server .wsdd like
that
... <handler
name="SimpleSessionHandler" type="java:org.apache.axis.handlers.SimpleSessionHandler"></handler>
<!-- Services from FMConnectorService WSDL service
--> <service
name="FMConnector"
provider="java:RPC">
<requestFlow>
<handler
type="SimpleSessionHandler"/>
<handler
type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler
type="SimpleSessionHandler"/>
<handler
type="soapmonitor"/>
</responseFlow> ...
Session management on the server
seems to work because I see (in the SOAPMonitor) a response with
session ID
<?xml
version="1.0"
encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:sessionID soapenv:actor=""
soapenv:mustUnderstand="0" xsi:type="xsd:long" xmlns:ns1="http://xml.apache.org/axis/session">6254954670844961902</ns1:sess ionID>
</soapenv:Header>
<soapenv:Body>
<ns2:commitReceiptResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="FMConnector">
<commitReceiptReturn xsi:type="xsd:string">org.apache.axis.session.SimpleSession@87e704 1</commitReceiptReturn>
</ns2:commitReceiptResponse>
</soapenv:Body>
</soapenv:Envelope>
My client app is simple and again a
modification of
the SimpleSessionHandler.
import
org.apache.axis.client.Service;
import
org.apache.axis.client.Call;
import
org.apache.axis.configuration.XMLStringProvider;
public class TestClient {
static final String clientWSDD
=
"<deployment xmlns=\"http://xml.apache.org/axis/wsdd/\" "
+ "xmlns:java=\"http://xml.apache.org/axis/wsdd/providers/java\">\n"
+
"
<handler type=\"java:org.apache.axis.handlers.SimpleSessionHandler\"
" +
"name=\"SimpleSessionHandler\"/>\n"
+
"<globalConfiguration>\n"
+
"
<requestFlow><handler type=\"SimpleSessionHandler\"/></requestFlow>\n"
+
"
<responseFlow><handler type=\"SimpleSessionHandler\"/></responseFlow>\n"
+
"</globalConfiguration>\n"
+
" <transport name=\"http\" "
+ "pivot=\"java:org.apache.axis.transport.http.HTTPSender\"/>\n"
+
"</deployment>";
static XMLStringProvider clientProvider =
new XMLStringProvider(clientWSDD);
public static void main(String[] args)
{
try
{
String
FMConnector_address = "http://localhost:8080/axis/services/FMConnector";
Service
svc = new
Service(clientProvider);
svc.setMaintainSession(true);
Call
call =
(Call)svc.createCall();
call.setTargetEndpointAddress(new java.net.URL(FMConnector_address));
System.out.println(call.invoke("FMConnector", "commitReceipt",
null));
System.out.println(call.invoke("FMConnector", "commitReceipt",
null));
System.out.println(call.invoke("FMConnector", "commitReceipt",
null));
System.out.println(call.invoke("FMConnector", "commitReceipt",
null));
} catch (Exception e)
{
e.printStackTrace();
}
}
}
I'm just calling the service method four times. That works but
there is no session ID in the request
(!?)
<?xml
version="1.0"
encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:commitReceipt
xmlns:ns1="FMConnector"/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
So what's wrong ?
A few words to
the wsdd in the client app. I used that bit in the originally example
and it works fine. I tried also variations with <requestFlow> and
<responseFlow> inside the <transport>
tag.
Another question: How can I set e.g. the timeout for
the SessionHandler ? Is there a way to put it in server wsdd ? As I
mentioned before, the server bits are generated. In which part can
I put handler related stuff like changing the timeout programmatically
(in the skeleton
?).
Thanks
Sven
-----Urspr�ngliche Nachricht----- Von: Sven
Dilsen [mailto:[EMAIL PROTECTED]] Gesendet: Mo 10.02.2003 11.51
Uhr An: '[EMAIL PROTECTED]' Cc:
Betreff: sessions and client
config
|