By default, Tomcat sends some HTML content back to the client if it encounters something like an HTTP 404. I know that via web.xml
an <error-page>
can be configured to customize this content.
However, I'd just like for Tomcat to not send anything in terms of response content (I'd still like the status code, of course). Is there any way to easily configure this?
I'm trying to avoid A) explicitly sending empty content on the response stream from my Servlet, and B) configuring custom error pages for a whole bunch of HTTP error statuses in my web.xml
.
For some background, I'm developing an HTTP API and am controlling my own response content. So for an HTTP 500, for example, I'm populating some XML content on the response containing error information. For situations like an HTTP 404, the HTTP response status is sufficient for clients, and the content tomcat is sending is unnecessary. If there's a different approach, I'm open to hearing it.
Edit: After continued investigation, I still can't find much in the way of a solution. If someone can definitively say this is not possible, or provide a resource with evidence that it will not work, I'll accept that as an answer and try and work around it.
As Heikki said, setting the status instead of
sendError()
causes the Tomcat not touch the response entity/body/payload.If you only want to send the response headers without any entity, like in my case,
does the trick. With
Content-Length: 0
, theprint()
will have no effect even if used, like:the client receives something like:
If you want to send some error message, use the
setContentLength()
with message length (other than zero) or you can leave it to the serverAlthough it's Servlet spec compliant, for security reasons I don't want tomcat or any other Servlet container to send error details. I struggled with this as well a bit. After searching and trying, the solution can be summed up as:
sendError()
, usesetStatus()
insteadsendError()
though...Filter
thata. redirects calls to
sendError()
tosetStatus()
b. flushes the response at the end to prevent the container from further modifying the response
A little example servlet filter doing this can be found here.