I'm developing a Java Web Service. At this moment I can get Http header requests. But I want to add more header requests.
I'm currently doing this in a servlet filter.
@WebFilter(urlPatterns = {"/*"})
public class AddHeader implements Filter {
@Resource
private WebServiceContext context;
public AddHeader() {
}
@Override
public void init(FilterConfig fConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(
ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (request.getContentLength() != -1 && context != null) {
MessageContext mc = context.getMessageContext();
((HttpServletResponse) response).addHeader(
"Operation", "something"
);
}
chain.doFilter(request, response);
}
}
The problem with this strategy is that the added header is static.
With SoapHandler class I can obtain a SOAP message - dynamic:
public class SoapClass implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext messageContext) {
log(messageContext);
return true;
}
@Override
public Set<QName> getHeaders() {
Set<QName> qNames = Collections.EMPTY_SET;
return qNames;
}
@Override
public boolean handleFault(SOAPMessageContext messageContext) {
log(messageContext);
return true;
}
@Override
public void close(MessageContext context) {
}
public static String getMsgAsString(SOAPMessage message) {
String msg = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
message.writeTo(baos);
msg = baos.toString();
} catch (SOAPException | IOException soape) {
}
return msg;
}
private String soapToString(SOAPMessage message, boolean indent) {
final StringWriter sw = new StringWriter();
try {
TransformerFactory.newInstance().newTransformer().transform(
new DOMSource(message.getSOAPPart()),
new StreamResult(sw));
} catch (TransformerException e) {
throw new RuntimeException(e);
}
return (indent ? sw.toString() : sw.toString().replaceAll("[\\r\\n]", ""));
}
So, what I really wanted was to join dynamic soap message with filter. How can I achieve this?
While I'm still not entirely clear on what you really want, I will describe how to add HTTP headers in a SOAP web service response. The cleanest place to do this is in a JAX-WS handler, not unlike what you already have in the form of SoapClass
.
To do this in your SOAPHandler, you must first obtain access to the list of headers in the underlying HttpServletResponse
. This list is provided by the SOAPMessageContext
:
@Override
public boolean handleMessage(SOAPMessageContext context) {
//This property checks whether the handler is being invoked for a service response
boolean response= ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();
if (response) {
//this is a JAX-WS-provided map of HTTP headers
Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_RESPONSE_HEADERS);
if (null == headers) {
//create a new map of HTTP headers if there isn't already one
headers = new HashMap<String, List<String>>();
}
//add your desired header
headers.put("Operation",Collections.singletonList("something");
}
return true;
}
An alternative approach is to access the HttpServletResponse
that's underlying the web service response:
@Override
public boolean handleMessage(SOAPMessageContext context) {
//This property checks whether the handler is being invoked for a service response
boolean response= ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();
if (response) {
//this is underlying http response object
HttpServletResponse response = (HttpServletResponse) context.get(MessageContext.SERVLET_RESPONSE);
//add your desired header
response.addHeader("Operation", "something");
}
return true;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With