Author
Servlet using SAAJ and HTTP Authorization Header
Julian Noye
Greenhorn
Joined: Nov 17, 2008
Posts: 3
Hi Guys I am trying to create a servlet that uses SAAJ to communicate with a SOAP webservice. The webservice uses user/pw in the HTTP Authorization header to validate the request. My problem is I have not been able to set the user/pw in the HTTP header and I get a 401 return code. I have based my servlet on this example http://faq.javaranch.com/java/WebServicesHowTo#saaj-client Here is my code, package examples.java.servlets; import java.io.*; import java.util.Iterator ; import javax.servlet.*; import javax.servlet.http.*; import javax.xml.soap.MessageFactory ; import javax.xml.soap.MimeHeaders ; import javax.xml.soap.SOAPBody ; import javax.xml.soap.SOAPConnection ; import javax.xml.soap.SOAPConnectionFactory ; import javax.xml.soap.SOAPElement ; import javax.xml.soap.SOAPEnvelope ; import javax.xml.soap.SOAPException ; import javax.xml.soap.SOAPHeader ; import javax.xml.soap.SOAPHeaderElement ; import javax.xml.soap.SOAPMessage ; import javax.xml.soap.SOAPPart ; import org.w3c.dom.Node ; public class HelloServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException ,IOException{ String username = request.getParameter("julian"); String password = request.getParameter("pw"); Integer timeout = new Integer(5*60*1000); String operation = "getLanguages"; String urn = "LanguagesRequest"; String destination = "http://julian.vic.imrworldwide.com:8081/axis2/services/Reference"; try { // First create the connection SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnFactory.createConnection(); // Next, create the actual message MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage message = messageFactory.createMessage(); SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); // Set HTTP headers. // This does not work!!! String authorization = new sun.misc.BASE64Encoder().encode((username+":"+password).getBytes()); MimeHeaders hd = message.getMimeHeaders(); hd.addHeader("Authorization", "Basic " + authorization); // Create and populate the body SOAPBody body = envelope.getBody(); // Create the main element and namespace SOAPElement bodyElement = body.addChildElement( envelope.createName(operation, "ns1", "http://sc.online.nielsen.com/api/ws")); // Add parameters bodyElement.addChildElement("LanguagesRequest"); envelope = soapPart.getEnvelope(); SOAPHeader sh = envelope.getHeader(); sh = null; // Save the message message.saveChanges(); SOAPMessage msg = message; // Send the message and get the reply SOAPMessage reply = connection.call(msg, destination); // Retrieve the result - no error checking is done: BAD! soapPart = reply.getSOAPPart(); body = envelope.getBody(); Iterator iter = body.getChildElements(); Node resultOuter = ((Node) iter.next()).getFirstChild(); Node result = resultOuter.getFirstChild(); //System.out.println("add("+arg1+","+arg2+") = "+result.getNodeValue()); // Close the connection connection.close(); } catch (Exception e) { System.out.println(e.getMessage()); } response.setContentType("text/html"); PrintWriter pw = response.getWriter(); pw.println("<html>"); pw.println("<head><title>Hello World SC API</title></title>"); pw.println("<body>"); pw.println("<h1>Hello World SC API 999.0</h1>"); pw.println("</body></html>"); } }
SCJP<br />SCEA
Ulf Dittmer
Marshal
Joined: Mar 22, 2005
Posts: 35443
posted Nov 17, 2008 22:35:00
0
Welcome to JavaRanch. There's currently a bug in Axis2 that prevents any SOAP headers from being transmitted. I'm trying to get the priority on that one raised, but have no word yet on when it might be fixed. This means that SAAJ clients can't use HTTP authentication with the Axis2 libraries. The workarounds would be either to use the Axis1 libraries for the client, or to use a JAX-WS client. [ November 17, 2008: Message edited by: Ulf Dittmer ]
Android apps – ImageJ plugins – Java web charts
subject: Servlet using SAAJ and HTTP Authorization Header