Tomcat对错误页面处理方法的问题

本文介绍了如何在Tomcat中配置自定义错误页面,包括解决中文乱码问题的方法、获取异常信息的方式以及实践中遇到的常见问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各位都知道,我们可以在web.xml中定义对错误发生时的提示页面,例如

<error-page> 
  <error-code>500</error-code> 
  <location>/500.vm</location>
</error-page>

在这里我是用一个Velocity的模板页面来负责提示错误信息, 这个配置指明了当程序出现500错误的时候就执行500.vm这个页面.

在编写500.vm这个页面的时候有两个地方需要注意的

第一是编码问题(又是编码问题):Tomcat对这个页面总是用ISO8859_1编码进行处理,所以你对页面再怎么设置编码方式,出来的中文信息都会全变成问号. 因此我们需要顺应Tomcat的做法,将所有的中文字转成ASCII的表达方式,如果是velocity,那你可以用$escape.html("")这个方法来将中文转成ASCII码,例如 $escape.html("回到上页") 得到的结果是: &#22238;&#21040;&#19978;&#39029;

其他的例如JSP可以参考相应的处理办法.

第二个问题是如何获取所发生的异常信息

因为500错误是服务器内部错误,一般是我们的应用发生了异常,我们需要在错误处理页面中获取到这个异常然后显示相应的信息. 正规Servlet容器通过下面的代码即可取出异常

Throwable t = (Throwable)request.getAttribute(PageContext.EXCEPTION);

偏偏这行代码在Tomcat下取到的都是null, Tomcat容器你必须用下面这个语句来取异常信息

Throwable t = (Throwable)request.getAttribute("javax.servlet.error.exception");

 

==========================================

在Tomcat安装目录下的conf/web.xml最后的</web-app>之前增加如下代码:


<error-page>
                          
<error-code>404</error-code>
                          
<location>/ErrorPage404.jsp</location>
</error-page>
常见问题及解决:
404错误页出现这个问题,我在web.xml定义了如下的定义,


    <error-page>
    
<error-code>404</error-code>
    
<location>/error_404.htm</location>
  
</error-page>
    路径的是对的,奇怪的是我测试时输入一个不存在的页,出现404错误提示出现的却不是我所定义的页面,这就怪了.我记得在weblogic中我也是这样定 义的,所以我首先想到的时服务器的问题. 只是这种问题,不要分析,我试着在javaworld发了一贴,问了一下. 在google上搜了一下,才发现很多人都出现过这个问题.这是实际出问题,要是一直照着课本,应该不会想到这些问题,只是自己实际操作的才发现这些.

通看了所有的帖子,出现这种问题,主要有以下几个因素:
1.使用 tomcat 服务器
2.tomcat服务器版本
3.浏览器问题
4.IE的设置
5.错误页本身的大小

第一点,我想我的经历应该可以算个证明.

第二点.很多人用tomcat5.5可以顺利的找到错误页

第三点.换了一下FF,可以顺利找到指定的错误页

第四点.我设置了 工具-->Internet选项-->高级--->显示http友好错误信息(取消选择) ,可以顺利定向到指定错误页,说明可以,不过好像不能要求别人都这么干。

第五点,我试着发狠输了一大堆东西进去, 指定错误页顺利出现了.


下面是提供的解决方法:

1.升级tomcat (换成其它服务器,代价沉重)
2.ie 设定   工具-->Internet选项-->高级--->显示http友好错误信息(取消选择) ,
3. 把错误页做大一点,具体几个字节,没测试,估计三四百足够了, (加一个div块,display设为none就可以了)
4.设置指定错误页页状态为正确,骗过IE的自定义错误页方法



<%
     response.setStatus(
200); // 200 = HttpServletResponse.SC_OK
%>

 

### Tomcat 和 Nginx 错误页面配置 为了确保当发生错误时,能够正确显示由 Nginx 或者 Tomcat 提供的自定义错误页面而不造成相互跳转的情况,需要分别针对这两个服务器进行适当设置。 #### 修改 Nginx 的 `nginx.conf` 文件来处理 HTTP 请求并返回特定状态码对应的静态 HTML 页面[^4] 对于 Nginx 来说,在其配置文件中可以通过如下方式指定不同类型的错误响应: ```nginx server { listen 80; server_name localhost; error_page 404 /custom_404.html; location = /custom_404.html { root /usr/share/nginx/html; internal; } # Other configurations... } ``` 上述代码片段指定了当遇到 404 Not Found 错误时会重定向至 `/usr/share/nginx/html/custom_404.html` 这个位置下的自定义 404 页面。注意这里使用了 `internal` 关键字表示该 URL 只能通过内部重定向访问而不能被外部直接请求。 #### 调整 Tomcat 中的应用程序以避免重复定义相同的状态码映射[^1] 如果应用程序已经在 Web 应用级别的 web.xml 文件里设置了某些错误页,则可能会覆盖掉全局范围内的默认行为。因此建议移除这些局部设定或将它们调整为指向更合适的资源路径。 例如,在应用级 `web.xml` 中可能有如下配置: ```xml <error-page> <error-code>404</error-code> <location>/errors/not-found.jsp</location> </error-page> ``` 此时应该考虑删除此部分或将其改为其他不会引起冲突的形式,比如更改成相对链接形式以便于维护统一管理。 另外一种方法是在 Tomcat 层面禁用内置的自动错误页面机制,这可以在 `$CATALINA_HOME/conf/web.xml` 下找到相应的 `<error-page>` 元素并注释掉它即可实现。 最后一步就是确认所有的代理规则都已正确定义好,并且没有多余的循环引用存在。通常情况下只需要让 Nginx 处理前端流量并将实际业务逻辑转发给后端的服务实例(如 Tomcat),同时保持各自独立负责各自的错误展示工作就不会出现问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值