springMVC在web.xml设置可以拦截404,500等错误跳转到自定义页面,但是无法拦截400错误。
<error-page>
<error-code>404error-code>
<location>./404.jsplocation>
error-page>
<error-page>
<error-code>500error-code>
<location>./500.jsplocation>
error-page>
根据官网给出的方案需要重写ErrorReportValve处理400错误跳转到自定义页面,首先需要更改tomcat中的server.xml文件,在host中添加Valve,页面将不显示错误的详细信息。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.ErrorReportValve"
showReport="false" showServerInfo="false" />
Host>
然后要新建一个maven项目进行对ErrorReportValve的重写,在pom.xml里添加需要的文件。
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-catalinaartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-coyoteartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-el-apiartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-jaspic-apiartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-juliartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-servlet-apiartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-utilartifactId>
<version>${tomcat.version}version>
dependency>
<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-util-scanartifactId>
<version>${tomcat.version}version>
dependency>
重写tomcat的ErrorReportValve,新建CustomErrorReportValve
public class CustomErrorReportValve extends ErrorReportValve
重写report,读取需要的400页面,然后StringBuilder输出,也可以直接在StringBuilder中写html代码进行输出。
@Override
protected void report(Request request, Response response, Throwable t) {
StringBuilder sb = new StringBuilder();
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
sb.append("自定义HTML页面");
Writer writer = response.getReporter();
if (writer != null) {
writer.write(sb.toString());
}
}
然后项目打包。
mvn clean compile package
最后放到tomcat lib中,还需要更改server.xml文件,在host中添加errorReportValveClass为自定义class
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" errorReportValveClass="org.aspire.errorValve.CustomErrorReportValve">
重新启动tomcat,400页面就跳转到自定义的页面了。
(如果页面乱码在pom.xml里添加build即可解决)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.6source>
<target>1.6target>
<encoding>utf-8encoding>
configuration>
plugin>
plugins>
build>
https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/