Мне нужна пользовательская страница для моего остановленного или временно неиспользуемого веб-приложения.Сначала я создал пользовательскую страницу ошибок и поместил ее в /srv/www/html/maintenance/report.html.Затем я создал собственный клапан, скомпилировал, запустил jared и поместил его в папку lib tomcats (6).
package my.package;
import org.apache.catalina.Container;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.valves.ValveBase;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
* Created by IntelliJ IDEA.
* User: przemyslaw
* Date: 13.11.11
*/
public class AppErrorReportValve extends ValveBase {
String errorPagePath = null;
String appContextName = null;
String appContextPath = null;
public void invoke(Request request, Response response)
throws IOException, ServletException {
StandardContext appContext = (StandardContext)container.findChild(appContextName);
if((appContext==null || appContext.getState()!=1 || !appContext.getAvailable()) && request.getRequestURI().startsWith(appContextPath)){
if (response.isCommitted()) {
return;
}
// The response is an error
response.setError();
// Reset the response (if possible)
try {
response.reset();
} catch (IllegalStateException e) {
}
response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
response.setSuspended(false);
try {
//containerLog.info("render Error");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
renderError(response);
return;
} catch (Throwable tt) {
}
}
// Perform the request
getNext().invoke(request, response);
}
void renderError(Response response){
BufferedInputStream bis = null;
OutputStream os = null;
try
{
FileInputStream fis = new FileInputStream (errorPagePath);
bis = new BufferedInputStream (fis);
os = response.getOutputStream();
int byte_;
while ((byte_ = bis.read ()) != -1)
os.write (byte_);
}
catch (FileNotFoundException e)
{
containerLog.error("File not found " + errorPagePath, e);
// Do other stuff related to that exception (if necessary).
}
catch (IOException e)
{
containerLog.error("I/O Problem: ",e);
// Do other stuff related to that exception (if necessary).
}
finally
{
if (bis != null)
try
{
bis.close ();
}
catch (IOException e)
{
}
if (os != null)
try
{
os.flush();
os.close ();
}
catch (IOException e)
{
}
}
}
public String getErrorPagePath() {
return errorPagePath;
}
public void setErrorPagePath(String errorPagePath) {
this.errorPagePath = errorPagePath;
}
public String getAppContextName() {
return appContextName;
}
public void setAppContextName(String appContextName) {
this.appContextName = appContextName;
this.appContextPath = appContextName+"/";
}
}
По крайней мере, я настроил tomcats conf / server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Valve className="my.package.AppErrorReportValve" appContextName="/report" errorPagePath="/srv/www/html/maintenance/report.html" resolveHosts="false"/>
...
</Host>
Теперь tomcat показывает страницу недоступной пользовательской службы, когда мое веб-приложение / отчет остановлено или не развернуто.