创建自定义ErrorReportValveClass Tomcat
大家好,我不希望用户在异常期间看到tomcat生成的错误页面,我尝试通过两种方式实现这一点,创建自定义ErrorReportValveClass Tomcat,tomcat,Tomcat,大家好,我不希望用户在异常期间看到tomcat生成的错误页面,我尝试通过两种方式实现这一点, 1.扩展ValveBase类,并在的帮助下创建自己的ErrorReportClass版本。现在根据Tomcat文档 我需要为server.xml中的Host标记的errorReportValveClass属性指定类名,我这样做了,我还将该类转换为.jar文件以及其他所需的jar,把它放在Tomcat的lib文件夹中,但当我启动服务器时,它说ErrorReportClass找不到,这是我的代码 (请参阅负
1.扩展
ValveBase
类,并在的帮助下创建自己的ErrorReportClass
版本。现在根据Tomcat文档
我需要为server.xml
中的Host
标记的errorReportValveClass
属性指定类名,我这样做了,我还将该类转换为.jar
文件以及其他所需的jar
,把它放在Tomcat
的lib
文件夹中,但当我启动服务器时,它说ErrorReportClass
找不到,这是我的代码
(请参阅负责打印错误的report()
方法)
/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
*要更改此模板文件,请选择工具|模板
*然后在编辑器中打开模板。
*/
导入java.io.IOException;
导入java.io.Writer;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.catalina.Globals;
导入org.apache.catalina.connector.Constants;
导入org.apache.catalina.connector.Request;
导入org.apache.catalina.connector.Response;
导入org.apache.catalina.util.RequestUtil;
导入org.apache.catalina.util.StringManager;
导入org.apache.catalina.valves.ValveBase;
导入org.apache.tomcat.util.ExceptionUtils;
/**
*
*@作者Kainix
*/
公共类ErrorReportValve扩展ValveBase{
公共错误报告阀(){
超级();
}
/**
*与此实现相关的描述性信息。
*/
私有静态最终字符串信息
=“org.apache.catalina.valves.ErrorReportValve/1.0”;
/**
*此包的StringManager。
*/
受保护的静态最终StringManager sm=StringManager.getManager(Constants.Package);
//-------------------------------------------------------------属性
/**
*返回有关此阀门实施的描述性信息。
*/
@凌驾
公共字符串getInfo(){
返回(信息);
}
/**
*调用序列中的下一个阀门。当调用返回时,检查响应状态,并输出错误报告。
*
*@param request要处理的servlet请求
*@param response要创建的servlet响应
*
*@exception IOException如果发生输入/输出错误
*@exception ServletException如果发生servlet错误
*/
@凌驾
公共void调用(请求、响应)
抛出IOException、ServletException{
//执行请求
getNext().invoke(请求、响应);
if(response.isCommitted()){
返回;
}
//如果(!request.isAsyncStarted()){
//}其他{
//返回;
// }
丢弃的
=(可丢弃)request.getAttribute(Globals.EXCEPTION\u ATTR);
if(可丢弃!=null){
//该响应是一个错误
response.setError();
//重置响应(如果可能)
试一试{
response.reset();
}捕获(非法状态){
//忽略
}
senderError(HttpServletResponse.SC_内部_服务器_错误);
}
响应。设置暂停(错误);
试一试{
报告(请求、响应、可丢弃);
}捕获(可丢弃tt){
例外情况。可手动旋转(tt);
}
}
/**
*打印错误报告。
*
*@param request正在处理的请求
*@param response正在生成的响应
*@param throwable发生的异常(可能包装了根本原因异常)
*/
受保护无效报告(请求、响应、,
可丢弃的(可丢弃的){
//对非HTTP响应不执行任何操作
int statusCode=response.getStatus();
//在1xx、2xx和3xx状态下不执行任何操作
//如果已经写了什么,什么也不要做
if((状态代码<400)| |(response.getContentCount()>0)){
返回;
}
String message=RequestUtil.filter(response.getMessage());
如果(消息==null){
message=“”;
}
StringBuilder sb=新的StringBuilder();
某人加上(“”);
某人加上(“”);
sb.append(“这是自定义错误页..!!”;
某人加上(“”);
试一试{
试一试{
response.setContentType(“text/html”);
响应。setCharacterEncoding(“utf-8”);
}捕获(可丢弃的t){
if(container.getLogger().isDebugEnabled()){
container.getLogger().debug(“status.setContentType”,t);
}
}
Writer=response.getReporter();
if(writer!=null){
//如果writer为null,则表示响应已被删除
//已经做出了艰难的承诺,这是不应该发生的
写(某人写的东西);
}
}捕获(IOException |非法状态例外){
//忽略
}
}
}
它还要求
tomcat-catalina-7.0.47.jar
catalina-6.0.29
catalina.jar
,它会在Globals.EXCEPTION\u ATTR
处显示错误,任何人都无法使用这种方法,因为它给我ClassNotFound
,有时用于我自己的类,有时用于jar
文件中的类,所以我尝试了另一种方法
ErrorReportValve.java
文件中进行了更改(通过修改
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.IOException;
import java.io.Writer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Globals;
import org.apache.catalina.connector.Constants;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.util.RequestUtil;
import org.apache.catalina.util.StringManager;
import org.apache.catalina.valves.ValveBase;
import org.apache.tomcat.util.ExceptionUtils;
/**
*
* @author Kainix
*/
public class ErrorReportValve extends ValveBase {
public ErrorReportValve() {
super();
}
/**
* The descriptive information related to this implementation.
*/
private static final String info
= "org.apache.catalina.valves.ErrorReportValve/1.0";
/**
* The StringManager for this package.
*/
protected static final StringManager sm = StringManager.getManager(Constants.Package);
// ------------------------------------------------------------- Properties
/**
* Return descriptive information about this Valve implementation.
*/
@Override
public String getInfo() {
return (info);
}
/**
* Invoke the next Valve in the sequence. When the invoke returns, check the response state, and output an error report is necessary.
*
* @param request The servlet request to be processed
* @param response The servlet response to be created
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
@Override
public void invoke(Request request, Response response)
throws IOException, ServletException {
// Perform the request
getNext().invoke(request, response);
if (response.isCommitted()) {
return;
}
// if (!request.isAsyncStarted()) {
// } else {
// return;
// }
Throwable throwable
= (Throwable) request.getAttribute(Globals.EXCEPTION_ATTR);
if (throwable != null) {
// The response is an error
response.setError();
// Reset the response (if possible)
try {
response.reset();
} catch (IllegalStateException e) {
// Ignore
}
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
response.setSuspended(false);
try {
report(request, response, throwable);
} catch (Throwable tt) {
ExceptionUtils.handleThrowable(tt);
}
}
/**
* Prints out an error report.
*
* @param request The request being processed
* @param response The response being generated
* @param throwable The exception that occurred (which possibly wraps a root cause exception
*/
protected void report(Request request, Response response,
Throwable throwable) {
// Do nothing on non-HTTP responses
int statusCode = response.getStatus();
// Do nothing on a 1xx, 2xx and 3xx status
// Do nothing if anything has been written already
if ((statusCode < 400) || (response.getContentCount() > 0)) {
return;
}
String message = RequestUtil.filter(response.getMessage());
if (message == null) {
message = "";
}
StringBuilder sb = new StringBuilder();
sb.append("<html><head><title>");
sb.append("</head><body>");
sb.append("This is custom error page..!!");
sb.append("</body></html>");
try {
try {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
} catch (Throwable t) {
if (container.getLogger().isDebugEnabled()) {
container.getLogger().debug("status.setContentType", t);
}
}
Writer writer = response.getReporter();
if (writer != null) {
// If writer is null, it's an indication that the response has
// been hard committed already, which should never happen
writer.write(sb.toString());
}
} catch (IOException | IllegalStateException e) {
// Ignore
}
}
}