自定义Tomcat错误页面(举例)

本文介绍如何在Tomcat 5.5中自定义404错误页面,通过修改web.xml文件来实现友好的用户提示。文章包括配置步骤及注意事项。

为了获得很好的用户感受,不应当向用户暴露404这样的页面的。Tomcat不像IIS提供了各种类型的错误页,如果Tomcat发生错误就会显示千篇一律的错误页面。其实我们可以通过修改其配置文件,从而自定义设置其错误页面的显示。

1、在网上随便搜几个404页面

2、确保404页面大于512字节,这样浏览器才会正常显示

3、IE需要在“高级”里面选中“显示友好错误页面”

 

版本:tomcat 5.5
打开webapps/Root/WEB-INFO/web.xml文件,在最后一行的之前添加如下的语句:
<error-page>
<error-code>404</error-code>
<location>/404.htm</location>
</error-page> 

这里的404.htm应放在Root目录下面。否则如果放在Root的一个文件夹(errorpages)内,必须加上"/errorpages/404.htm",这时还需注意一点,404.htm里面的gif图片路径也要加上“/errorpages/imges/jjyy.gif”

 

重启TOMCAT,输入http://localhost/yyjjjjy  , 搞定.

你遇到的错误是: ``` HTTP 状态 405 – 不允许使用 类型:状态报告 消息:此 URL 不支持 HTTP 方法 POST 描述:在请求行中接收到的方法为源服务器所知,但目标资源不支持。 ``` --- ### ✅ 错误解释 > **HTTP 405 Method Not Allowed** 表示: > > 客户端(浏览器/AJAX)尝试使用某个 HTTP 方法(如 `POST`),但服务器上的目标资源 **不允许该方法**。 比如:你向一个只允许 `GET` 的 JSP 页面发送了 `POST` 请求,就会出现这个错误。 --- ## 🔍 常见原因及解决方案(结合 JSP 场景) --- ### ❌ 原因 1:JSP 页面未正确处理 `POST` 请求 JSP 默认可以接收 `GET` 和 `POST`,但如果容器配置或代码逻辑限制了方法,可能拒绝 `POST`。 #### 示例问题代码: ```jsp <!-- ReceiveXml.jsp --> <% if (request.getMethod().equals("GET")) { out.println("只支持 GET"); } else { response.sendError(405); // 手动返回 405 } %> ``` 或者根本没有处理 `POST` 的逻辑。 #### ✅ 解决方案: 确保你的 JSP 能处理 `POST` 请求,不要手动抛出 405。 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 允许 POST if ("POST".equalsIgnoreCase(request.getMethod())) { // 正常处理 POST 数据 String body; StringBuilder sb = new StringBuilder(); try (BufferedReader reader = request.getReader()) { while ((body = reader.readLine()) != null) { sb.append(body); } } out.println("收到 POST 数据:" + sb.toString()); } else { // 可选:禁止 GET response.setStatus(405); response.setHeader("Allow", "POST"); out.println("此接口仅接受 POST 请求。"); } %> ``` > ⚠️ 注意:要让 JSP 支持 `POST`,就不能在代码中主动拒绝它。 --- ### ❌ 原因 2:静态资源被当作接口调用(最常见) 你可能把一个 HTML 文件、图片路径或目录列表当成了可提交的目标。 #### 比如: ```html <form action="students/" method="POST"> ``` 而 `/students/` 是一个目录,没有默认的 `index.jsp` 或 Servlet 处理 `POST`。 #### 或者: ```html <form action="data.xml" method="POST"> ``` 你想往 XML 文件发 POST?不可能!静态文件不能接收 POST。 #### ✅ 解决方案: ✅ 目标必须是一个能处理 `POST` 的动态资源,例如: - `.jsp` 文件(且确实能处理 POST) - `.servlet` 或映射到 `HttpServlet` 的路径 ```html <form action="SaveStudent.jsp" method="post"> <!-- 必须存在且支持 POST --> ``` --- ### ❌ 原因 3:缺少 `web.xml` 配置或 Servlet 映射错误 如果你本意是访问一个 Servlet,但写错了 URL,可能会落到容器默认的 `DefaultServlet` 上(用于提供静态资源),它通常只支持 `GET`、`HEAD`,不支持 `POST`。 #### 举例: 你在浏览器访问: ``` http://localhost:8080/myapp/api/student ``` 但你没配置对应的 Servlet,Tomcat 使用 `DefaultServlet` 处理,结果报 405。 #### ✅ 解决方案: 在 `web.xml` 中正确定义映射 Servlet: ```xml <servlet> <servlet-name>StudentApi</servlet-name> <servlet-class>com.example.StudentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>StudentApi</servlet-name> <url-pattern>/api/student</url-pattern> </servlet-mapping> ``` 在 Servlet 中重写 `doPost()` 方法: ```java public class StudentServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.getWriter().println("Received POST"); } } ``` --- ### ❌ 原因 4:AJAX 发送到错误的 URL(大小写/拼写错误) URL 区分大小写! ```javascript fetch('/MyApp/ReceiveData.jsp', { method: 'POST' }) // 错误:文件叫 receiveData.jsp? ``` → 实际文件是 `receivedata.jsp`,导致找不到 → 容器回退到默认处理器 → 不支持 POST → 405。 #### ✅ 解决方案: 检查 URL 是否拼写正确,区分大小写,是否存在。 --- ### ❌ 原因 5:中间件或过滤器拦截了 POST 请求 某些安全过滤器(如 CSRF 过滤器)、框架(Struts/Spring MVC)可能会根据规则拒绝某些 `POST` 请求。 #### 检查点: - 是否有自定义 `Filter`? - 是否启用了安全框架? - 是否缺少必要的 token 或 header? #### ✅ 解决方案: 查看控制台日志,确认是否有过滤器抛出异常或主动调用 `response.sendError(405)`。 临时注释掉过滤器测试是否恢复。 --- ### ❌ 原因 6:服务器配置禁止 POST(罕见但存在) 某些嵌入式服务器或反向代理(Nginx、Apache)可能对特定路径禁用 `POST`。 #### Nginx 示例(错误配置): ```nginx location /api/ { limit_except GET { deny all; } } ``` → 所有非 GET 请求都被拒绝。 #### ✅ 解决方案: 检查 Nginx/Apache 配置,确保允许 `POST`。 --- ## ✅ 如何排查和修复? | 步骤 | 操作 | |------|------| | 1 | 查看浏览器开发者工具 → Network → 看请求 URL 和状态码 | | 2 | 检查目标 URL 是否指向 `.jsp` 或 `Servlet`,而非静态文件 | | 3 | 确保 JSP 或 Servlet 中没有 `sendError(405)` 或忽略 `POST` | | 4 | 在 JSP 中打印 `request.getMethod()` 看是否真的收到了 POST | | 5 | 查看 Tomcat 日志是否有异常 | | 6 | 测试用 `GET` 访问同一 URL 是否成功(判断资源是否存在) | --- ### ✅ 快速调试 JSP 是否支持 POST 创建一个简单的测试页 `TestPost.jsp`: ```jsp <%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <h2>请求方法: <%= request.getMethod() %></h2> <p>当前时间: <%= new java.util.Date() %></p> <% if ("POST".equalsIgnoreCase(request.getMethod())) { StringBuilder sb = new StringBuilder(); String line; try (BufferedReader reader = request.getReader()) { while ((line = reader.readLine()) != null) { sb.append(line); } } out.println("<h3>收到数据:</h3><pre>" + sb.toString() + "</pre>"); } else { out.println("<p>请用 POST 方法测试。</p>"); } %> </body> </html> ``` 然后用 AJAX 或 Postman 发送 POST 请求测试。 --- ### ✅ 总结:HTTP 405 的五大原因 | 原因 | 是否常见 | 解决方法 | |------|----------|-----------| | 1. JSP/Servlet 未处理 POST | ✅ 常见 | 添加 `doPost()` 或移除限制 | | 2. 目标是静态文件或目录 | ✅ 非常常见 | 改为指向可处理 POST 的动态资源 | | 3. URL 拼写错误或大小写不符 | ✅ 常见 | 检查路径是否正确 | | 4. Filter 或安全配置拦截 | ⚠️ 中等 | 查日志、关过滤器测试 | | 5. 反向代理禁止 POST | ❌ 较少 | 检查 Nginx/Apache 配置 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值