从 servlet java 抛出的自定义 503 错误页面
Posted
技术标签:
【中文标题】从 servlet java 抛出的自定义 503 错误页面【英文标题】:custom 503 error page thrown from servlet java 【发布时间】:2011-07-22 20:17:39 【问题描述】:这非常简单明了。我想从 servlet 端抛出 503 错误。
response.sendError(503);
当它被抛出时,我需要它来访问自定义错误页面。基本上是一个 503 错误页面本身,但有一些修改。
假设我有503.html
,我添加了
<error-page>
<error-code>503</error-code>
<location>/503.html</location>
</error-page>
在web.xml
。
我创建了一个 war 文件,其中包含一个引发 503 错误的 servlet,以及带有此内容的 web.xml
。我将503.html
保留在父文件夹位置。 (我应该把它放在别处吗?)
我在 WLS 中部署了应用程序,但这个自定义 503.html
没有受到影响。我收到一般的 503 错误。
我错过了什么吗?
我的代码如下:
webapp1.war
->网络信息
->web-inf->classes->prject4->Class1.class
->web-inf->jsp->error->custom.html
web.xml
<?xml version="1.0"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Class1</servlet-name>
<servlet-class>project2.Class1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Class1</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<error-page>
<error-code>503</error-code>
<location>/WEB-INF/jsp/error/custom.html</location>
</error-page>
</web-app>
class1.java
public class Class1 extends HttpServlet
private ServletConfig config;
public void init(ServletConfig config)throws ServletException
this.config=config;
public void service (HttpServletRequest request, HttpServletResponse response)
throws IOException
response.setContentType("text/html");
ServletOutputStream l_out = response.getOutputStream();
response.sendError(503);
【问题讨论】:
“父文件夹位置”是什么意思?如果您将其配置为“/503.html”,则应将 html 页面放在根文件夹的正下方。 @didxga 是的 /503.html 与 WEB-INF 文件夹一起保存在根文件夹中。 请画出你的文件结构。 @didxga 修改了问题。 @Tom 您是否将 WL 作为应用服务器与另一个 Web 服务器一起使用? 【参考方案1】:好的,这是一个我一开始没有发现的小错误。
在我的web.xml
中,servlet 映射为/*
,这导致了无限循环条件,因为它抛出了与其映射相同的代码。所以我不得不调整 servlet 映射,以便 Class1
不会映射到任何错误页面——比如 /images/*
。
然后一切都开始正常了。 :)
【讨论】:
【参考方案2】:您也可以尝试使用自定义错误处理程序来处理它。
public void service (HttpServletRequest request, HttpServletResponse response)
throws IOException
try
//some error generating code
throw new Exception("503_Exception");
catch(Exception e)
response.sendRedirect(HandleError.handle(e, request));
一个单独的类来处理错误。这可以处理不同类型的错误。 您可以添加功能来记录堆栈跟踪,如果出现问题则发送电子邮件等。
public class HandleError
public static String handle(Throwable t, javax.servlet.http.HttpServletRequest request)
String sErrorMsg = t.getMessage();
if (sErrorMsg.equals("503_Exception"))
request.setAttribute("msg", Constants.EINVALSESSION);
return "/503.html";
return "/default_error.html";
【讨论】:
我不断收到 page not found 404 错误。我正在返回 "/WEB-INF/jsp/error/custom.html" 。它被重定向到该位置,但我收到错误 404--未找到。有什么想法吗? @Tom 您是否有理由将 html 文件放在“WEB-INF”文件夹中?当您将 jsp 放在 WEB-INF 文件夹中时,您无法直接访问该 JSP。要访问它,您必须在 web.xml 中创建一个 servlet 条目,它将您映射到特定的 jsp。我建议你把它放在 WEB-INF 之外,这样你就可以直接访问它。在我的示例中,“503.html”和“default_error.html”直接放在“WEB-INF”之外。【参考方案3】:如果您使用 Maven 作为您的项目构建工具,那么它将在 src/main/webapp 目录中查找,例如,我们的配置如下所示:
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/error404.html</location>
</error-page>
我们的 error404.html 位于文件夹中:
$PROJECT_NAME/src/main/webapp/WEB-INF/jsp/error/
如果您不使用 Maven,则该位置中的路径将有一个基本目录,该目录位于您放置 index.jsp 的任何位置
【讨论】:
不,我没有使用 maven,我只是在 java sdk 中使用了 jar 命令。 更清晰地修改了问题。【参考方案4】:我猜你的自定义错误页面的字节数有一个最小限制。下限通常为 512 字节。见Important note for your Custom error pages。在使用 Tomcat 时,我也在 Google-Chrome 中看到了这种行为。
【讨论】:
我正在使用 FF。我的 custom.html 是 1388 字节。 @Tom,那么我想这与您的 web.xml 中指定的页面位置有关,尽管它看起来不错。 @Tom,尝试以这种方式重新排列您的结构:webapp1.war-->jsp-->error-->custom.html,然后将位置配置更改为/jsp/error/custom。 html。虽然你的方式似乎是正确的 @Tom 日志说什么?我没用过WL,但是Tomcat有一个访问日志打印的方式,每个文件都被访问,格式为%h %l %u %t "%r" %s %b
。如果在使用自定义错误页面时状态码为 404,则表示找不到您的页面,浏览器显示默认。更多@tomcat 5.5 reference docs以上是关于从 servlet java 抛出的自定义 503 错误页面的主要内容,如果未能解决你的问题,请参考以下文章