JAVA SERVLET - Getting the SOAPACTION from a SOAPMESSAGE posted to a Java servlet.
I've been working on a project that utilizes a Java servlet to accept POST via the doPost method of a class that extends the HttpServlet class.
In order to get the SOAPACTION from a SOAPMESSAGE POST, you will need to parse the MimeHeaders of the request (HttpServletRequest).
NOTE: I purposely left out some imports and other methods not need for this post to shorten the content length. Error handling and such forth is being left out for simplicity of the post.
First you will need a MimeHeaders Object to store the Request.
import saaj.SaajUtils
import javax.xml.soap.MimeHeader;
import import javax.xml.soap.MimeHeaders;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
protected void
doPost(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
try
MimeHeader mh = SaajUtils.getHeaders(req);
}catch (Exception ex) {
Logger.getLogger("Exception").log(Level.SEVERE, null, ex);
//Return a server error if things go wrong to simplify things for the post
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
I used the SaajUtils class, which included methods to parse MimeHeaders, i will include that class later in this post.
Next we will use a method to parse the MimeHeader returned and extract the SOAPACTION from the MimeHeaders. This method will accept an Iterator Object to loop over. In order to get the Iterator Object, you will need to call the "getAllHeaders()" of the MimeHeader returned by the SaajUtils class method call.
private String getSoapAction(Iterator allHeaders) {
String soapAction = null;
while (allHeaders.hasNext()) {
MimeHeader header = (MimeHeader) allHeaders.next();
if (header.getName().equalsIgnoreCase("soapaction")) {
soapAction = header.getValue().replaceAll("\"", "");
}
}
return soapAction;
}
//Now add these lines
Iterator iterator = mh.getAllHeaders();
String soapAction = getSoapAction(iterator);
//Here's our SaajUtils class used
package saaj;
import java.io.ByteArrayInputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.activation.DataHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
/**
*
* @author Aalford
*/
public class SaajUtils {
/**
* extract the MIME header information from within the HTTP Request
* @param req the http request
* @return MimeHeaders as defined within the SAAJ API
*/
public static MimeHeaders getHeaders(HttpServletRequest req) {
Enumeration enumeration = req.getHeaderNames();
MimeHeaders headers = new MimeHeaders();
while( enumeration.hasMoreElements() ) {
String headerName = (String) enumeration.nextElement();
String headerValue = req.getHeader( headerName );
StringTokenizer values = new StringTokenizer( headerValue, ",");
while (values.hasMoreTokens()) {
headers.addHeader(headerName, values.nextToken().trim());
}
}
return headers;
}
/**
* stuff the MIME headers into the HTTP response
* @param headers the SAAJ MIME headers
* @param res the Http servlet response
*/
public static void putHeaders(MimeHeaders headers, HttpServletResponse res) {
for (Iterator it = headers.getAllHeaders(); it.hasNext();) {
MimeHeader header = (MimeHeader) it.next();
String[] values = headers.getHeader(header.getName());
if (values.length == 1) {
res.setHeader(header.getName(), header.getValue());
} else {
StringBuffer concat = new StringBuffer();
for (int i = 0; i < values.length; i++) {
if (i != 0) {
concat.append(',');
}
concat.append(values[i]);
}
res.setHeader(header.getName(), concat.toString());
}
}
}
public static void attachBytes(SOAPMessage soapMessage, byte[] theBytes, String contentType)
throws SOAPException {
AttachmentPart attachment = soapMessage.createAttachmentPart();
attachment.setContent(new ByteArrayInputStream(theBytes), contentType);
soapMessage.addAttachmentPart(attachment);
}
public static void attachUrlContents(SOAPMessage soapMessage, String urlLocation, String contentType)
throws SOAPException, MalformedURLException {
URL url = new URL(urlLocation);
AttachmentPart attachment = soapMessage.createAttachmentPart(new DataHandler(url));
attachment.setContentType(contentType);
soapMessage.addAttachmentPart(attachment);
}
public static String getAttachmentReport(SOAPMessage soapMessage) throws SOAPException {
int numOfAttachments = soapMessage.countAttachments();
Iterator attachments = soapMessage.getAttachments();
StringBuffer buf = new StringBuffer("Number of attachments: ");
buf.append(numOfAttachments);
while (attachments.hasNext()) {
buf.append("\n--------------------------------------------\n");
AttachmentPart attachment = (AttachmentPart) attachments.next();
buf.append("\nContent Location: " + attachment.getContentLocation());
buf.append("\nContent Id: " + attachment.getContentId());
buf.append("\nContent Size: " + attachment.getSize());
buf.append("\nContent Type: " + attachment.getContentType());
}
return buf.toString();
}
}
And that sum's it up
import saaj.SaajUtils
import javax.xml.soap.MimeHeader;
import import javax.xml.soap.MimeHeaders;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
MimeHeader mh = SaajUtils.getHeaders(req);
Iterator iterator = mh.getAllHeaders();
String soapAction = getSoapAction(iterator);
String message = "SOAPACTION: " + soapAction;
//Set the return status to SuccessFul HTTP/1.1 200 OK
resp.setContentType("text/xml");
//Using a method of the "HttpServletResponse" class
resp.setStatus(resp.SC_OK);
//Finally output the information to the browser
out.println("");
out.println(message);
out.println("");
}catch (Exception ex) {
Logger.getLogger("Exception").log(Level.SEVERE, null, ex);
//Return a server error if things go wrong to simplify things for the post
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
private String getSoapAction(Iterator allHeaders) {
String soapAction = null;
while (allHeaders.hasNext()) {
MimeHeader header = (MimeHeader) allHeaders.next();
if (header.getName().equalsIgnoreCase("soapaction")) {
soapAction = header.getValue().replaceAll("\"", "");
}
}
return soapAction;
}



No Response to "JAVA SERVLET - Getting the SOAPACTION from a SOAPMESSAGE posted to a Java servlet."
Post a Comment