Hi Guys,
I am too working with cookies for my Spring webservices. Please can you show me the code tha you use on the Server side to generate a cookie and store the data in the cookie and send it back to the client.
Cheers,
Sanjay Patil
Hi Guys,
I am too working with cookies for my Spring webservices. Please can you show me the code tha you use on the Server side to generate a cookie and store the data in the cookie and send it back to the client.
Cheers,
Sanjay Patil
This is my servlet code:
You need to change web.xml for your server to configure web services:Code:package org.foo; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.ws.transport.http.MessageDispatcherServlet; public class MyMessageDispatcherServlet extends MessageDispatcherServlet { @Override protected void doService(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { HttpSession session = httpServletRequest.getSession(); super.doService(httpServletRequest, httpServletResponse); } }
Code:<!-- Spring-WS Servlet --> <servlet> <servlet-name>WebServices</servlet-name> <servlet-class>org.foo.MyMessageDispatcherServlet</servlet-class> ... </servlet>
Hi,
Thanks for the response. I do have some more queries now.
1. I want to call the webservices from a service class which is a POJO class, not from jsp or Servlet as shown above. So is there any Spring utility class I can use to get a handle to HttpServletRequest. I can see you guys have used below code for the same, which i guess is in a jsp file.
HttpServletRequest srequest = (HttpServletRequest) ((this.getPageContext()).getRequest());
I have not tried below code yet which I found on another forum log. I presume this will work only if I have server connection which is not the case for me.
TransportContext context = TransportContextHolder.getTransportContext();
HttpServletConnection connection = (HttpServletConnection) context.getConnection();
HttpServletRequest request = connection.getHttpServletRequest();
Cheers,
Sanjay Patil
Hi,
Sorry, I forgot to attach my code. Please find the same below.
Code:package com.sample.webservice; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import javax.servlet.http.HttpServletRequest; import javax.xml.transform.TransformerException; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpState; import org.apache.commons.httpclient.methods.PostMethod; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.client.core.WebServiceMessageCallback; import org.springframework.ws.client.core.WebServiceTemplate; import org.springframework.ws.pox.dom.DomPoxMessageFactory; import org.springframework.ws.transport.WebServiceConnection; import org.springframework.ws.transport.WebServiceMessageSender; import org.springframework.ws.transport.context.TransportContext; import org.springframework.ws.transport.context.TransportContextHolder; import org.springframework.ws.transport.http.CommonsHttpConnection; import org.springframework.ws.transport.http.CommonsHttpMessageSender; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; public class WebServiceAgent { private WebServiceTemplate webServiceTemplate; private class MyCommonsHttpMessageSender extends org.springframework.ws.transport.http.CommonsHttpMessageSender { public WebServiceConnection createConnection(URI uri) throws IOException { CommonsHttpConnection connection = (CommonsHttpConnection) super.createConnection(uri); PostMethod pm = connection.getPostMethod(); Cookie[] cookies = getHttpClient().getState().getCookies(); int numberOfCookies = cookies.length; for (int i = 0; i < numberOfCookies; i++) { pm.addRequestHeader("Cookie", cookies[i].toString()); } return connection; } public boolean supports(URI arg0) { // TODO Auto-generated method stub return false; } } class MyWebServiceMessageCallback implements WebServiceMessageCallback { public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { TransportContext transportContext = TransportContextHolder.getTransportContext(); WebServiceConnection connection = transportContext.getConnection(); /**/ } } public static void main(String[] args) { WebServiceAgent webServiceTest = new WebServiceAgent(); webServiceTest.doSomething(); } public void doSomething() { StringSource stringSource = new StringSource("..... INPUT XML ......"); StringResult stringResult = new StringResult(); // initializing the webservicetemplate in place of using application context xml. webServiceTemplate = new MyWebServiceTemplate(new DomPoxMessageFactory()); MyCommonsHttpMessageSender messageSender = new MyCommonsHttpMessageSender(); try { messageSender.createConnection(new URI("http://localhost:9081/webserviceURL")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } webServiceTemplate.setMessageSender(messageSender); webServiceTemplate.setDefaultUri("http://localhost:9081/webserviceURL"); // end of webservice initialization WebServiceMessageSender[] senders = webServiceTemplate.getMessageSenders(); CommonsHttpMessageSender commons = (CommonsHttpMessageSender) senders[0]; HttpClient client = new HttpClient(); HttpState state = new HttpState(); // Build the JSESSIONID cookie I need to send to my web service HttpServletRequest srequest = (HttpServletRequest) ((this.getPageContext()).getRequest()); javax.servlet.http.Cookie cookies[] = srequest.getCookies(); for (int i = 0; i < cookies.length; i++) { javax.servlet.http.Cookie c = cookies[i]; if (c.getName().equals("JSESSIONID")) { org.apache.commons.httpclient.Cookie newCookie = new org.apache.commons.httpclient.Cookie(); newCookie.setDomain(c.getDomain()); newCookie.setPath(c.getPath()); newCookie.setName(c.getName()); newCookie.setValue(c.getValue()); state.addCookie(newCookie); } } client.setState(state); commons.setHttpClient(client); webServiceTemplate.sendSourceAndReceiveToResult(stringSource, new MyWebServiceMessageCallback(), stringResult); } }
So you need to obtain JSESSIONID from somewhere to identify yourself with the webservice.
You need to store JSESSIONID which server generates at first HttpRequest, and then somehow pass it to the client code, so it can authenticate itself with same JSESSIONID as the code you posted shows. I don't know which technologies are you using, and what is the scenario of communication through WS. But when you have no previous Http communication with server, then you cant have any JSESSIONID. Dont know if i put this straight![]()
Hi ,
i did some R&D in Spring webservices then after i got a idea to get the proper response from the service provide... in below i mentioned some code please try to follow...............
public String clientRequestWebService(final String productName, String xigniteBody) throws WebServiceTemplateException {
final StreamSource xigniteBodySource = new StreamSource(new StringReader(xigniteBody));
StreamResult result = new StreamResult(System.out);
log.debug("Resutl ::::: >>>>>>>> "+ result);
if(webServiceTemplate == null) {
throw new WebServiceTemplateException("Web Service Template Shouldn't be Null");
}
MyCommonsHttpMessageSender messageSender = new MyCommonsHttpMessageSender();
try {
messageSender.createConnection(new URI("http://www.xxxx.com/xCurrencies.asmx"));
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
webServiceTemplate.setMessageSender(messageSender) ;
webServiceTemplate.setDefaultUri("http://www.xxxx.com/xCurrencies.asmx?op="+ productName);
boolean flag = webServiceTemplate.sendSourceAndReceiveToResult( xigniteBodySource, new WebServiceMessageCallback() {
@Override
public void doWithMessage(WebServiceMessage arg0) throws IOException, TransformerException {
SaajSoapMessage saajSoapMessage = ( SaajSoapMessage )arg0;
saajSoapMessage.getSaajMessage();
saajSoapMessage.setSoapAction( "http://www.xxxx.com/services/"+ productName);
StringSource headerSource = new StringSource(getRequestHeader());
SoapHeader soapHeader = ((SoapMessage) arg0).getSoapHeader();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, soapHeader.getResult());
}
}, result );
log.debug("webServiceTemplate.sendSourceAndReceive ToResult Flag : "+ flag);
return null;
}
public String getRequestHeader() {
StringBuffer sbHeader = new StringBuffer();
sbHeader.append("<Header xmlns=\"http://www.xignite.com/services/\">");
sbHeader.append("<Username>");
sbHeader.append("xx");
sbHeader.append("</Username>");
sbHeader.append("<Password> ");
sbHeader.append( "xxx" );
sbHeader.append("</Password>");
sbHeader.append("</Header>");
log.debug("Header Content : "+ sbHeader.toString());
return sbHeader.toString();
}
public class MyCommonsHttpMessageSender extends org.springframework.ws.transport.http.CommonsHttpM essageSender {
@Override
public WebServiceConnection createConnection(URI uri) throws IOException {
CommonsHttpConnection connection = (CommonsHttpConnection) super.createConnection(uri);
return connection;
}
}