privatestaticfinal Log log = LogFactory.getLog(StandardHostValve.class); privatestaticfinal StringManager sm = StringManager.getManager(StandardHostValve.class);
// Saves a call to getClassLoader() on very request. Under high load these // calls took just long enough to appear as a hot spot (although a very // minor one) in a profiler. privatestaticfinal ClassLoader MY_CLASSLOADER = StandardHostValve.class.getClassLoader();
// Select the Context to be used for this Request
Context context = request.getContext(); if (context == null) { // Don't overwrite an existing error if (!response.isError()) {
response.sendError(404);
} return;
}
if (request.isAsyncSupported()) {
request.setAsyncSupported(context.getPipeline().isAsyncSupported());
}
if (!asyncAtStart && !context.fireRequestInitEvent(request.getRequest())) { // Don't fire listeners during async processing (the listener // fired for the request that called startAsync()). // If a request init listener throws an exception, the request // is aborted. return;
}
// Ask this Context to process this request. Requests that are // already in error must have been routed here to check for // application defined error pages so DO NOT forward them to the // application for processing. try { if (!response.isErrorReportRequired()) {
context.getPipeline().getFirst().invoke(request, response);
}
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
container.getLogger().error("Exception Processing " + request.getRequestURI(), t); // If a new error occurred while trying to report a previous // error allow the original error to be reported. if (!response.isErrorReportRequired()) {
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
throwable(request, response, t);
}
}
// Now that the request/response pair is back under container // control lift the suspension so that the error handling can // complete and/or the container can flush any remaining data
response.setSuspended(false);
Throwable t = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
// Protect against NPEs if the context was destroyed during a // long running request. if (!context.getState().isAvailable()) { return;
}
// Look for (and render if found) an application level error page if (response.isErrorReportRequired()) { // If an error has occurred that prevents further I/O, don't waste time // producing an error report that will never be read
AtomicBoolean result = new AtomicBoolean(false);
response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, result); if (result.get()) { if (t != null) {
throwable(request, response, t);
} else {
status(request, response);
}
}
}
if (!request.isAsync() && !asyncAtStart) {
context.fireRequestDestroyEvent(request.getRequest());
}
} finally { // Access a session (if present) to update last accessed time, based // on a strict interpretation of the specification if (context.getAlwaysAccessSession()) {
request.getSession(false);
}
if (realError instanceof ServletException) {
realError = ((ServletException) realError).getRootCause(); if (realError == null) {
realError = throwable;
}
}
// If this is an aborted request from a client just log it and return if (realError instanceof ClientAbortException) { if (log.isDebugEnabled()) {
log.debug(sm.getString("standardHost.clientAbort", realError.getCause().getMessage()));
} return;
}
if (container.getLogger().isDebugEnabled()) {
container.getLogger().debug("Processing " + errorPage);
}
try { // Forward control to the specified location
ServletContext servletContext = request.getContext().getServletContext();
RequestDispatcher rd = servletContext.getRequestDispatcher(errorPage.getLocation());
if (rd == null) {
container.getLogger()
.error(sm.getString("standardHostValue.customStatusFailed", errorPage.getLocation())); returnfalse;
}
if (response.isCommitted()) { // Response is committed - including the error page is the // best we can do
rd.include(request.getRequest(), response.getResponse());
// Ensure the combined incomplete response and error page is // written to the client try {
response.flushBuffer();
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
}
// Now close immediately as an additional signal to the client // that something went wrong
response.getCoyoteResponse().action(ActionCode.CLOSE_NOW,
request.getAttribute(RequestDispatcher.ERROR_EXCEPTION));
} else { // Reset the response (keeping the real error code and message)
response.resetBuffer(true);
response.setContentLength(-1);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.