从 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 错误页面的主要内容,如果未能解决你的问题,请参考以下文章

java写的excel导出时抛出的异常

Java:简述Java中的自定义异常

java异常信息如何返回给Servlet

笔记之_Java的自定义标签

为啥我看不到从 java 守护线程抛出的异常 [重复]

如何从 java servlet 中抛出 404 错误?