为什么请求总是404?

本次我们来说说关于404的一些内容。因为在公众号后台,和QQ群里,都有人在问一类的问题:

我应用已经部署好了,后台启动也没见到异常输出。请求Tomcat的manager这些都可以,为什么请求自己的应用总是返回404?

是啊,这是为什么呢?

我们来分析这个问题的描述。

1. 应用部署好了,后台没有异常输出。

2. Tomcat的manager应用可以正常请求

以上两点只能说明Tomcat正常启动,同时manager应用和用户的应用成功部署,但对于manager的请求正常,并不能保证你自己的应用也能正常请求。

毕竟,你的应用内资源是什么,和manager没有关联,甚至,你请求的时候,地址还可能写错。或者说,你眼睁睁看着应用部署在webapps目录下,但在浏览器里请求总是不停止的返回404。

上面这个问题是我们本次文章的主要分析的内容。我们首先来看,404这个HTTP请求的状态码,wikipedia里这样描述:

404(Not Found)这个HTTP错误信息,是个标准的响应码,在计算机网络通信中,标识client可以和server通信, 但server找不到client请求的资源。

在Tomcat里,404会在许多情形下返回。

我们前面的文章了说过,Tomcat里包含两个默认的Servlet:

JspServlet, DefaultServlet。(Tomcat是如何响应静态资源的?

我们随便请求Tomcat中一个不存在的资源时,例如下面两个都不存在的资源:

http://localhost:8080/abc 和 http://localhost:8080/abcd.jsp

这个时候,会请求到上面提到的这两个Servlet中。此时,由于资源并不存在,所以返回404和我们预期的一致。


例如DefaultServlet,在处理请求时,会在Resource中查找当前请求的资源是否存在。

这里用到了一个cache,记录了当前应用的所有资源内容,

在资源中找不到。下图是Tomcat根应用内的资源


这里的response设置完status和message后,整个处理流程结束,错误页面的展示,是根据具体的配置,不同的状态码对应可以对应到不同的页面,这里Tomcat的错误页面,我们前面文章分析过具体实现。(你的错误页面。不,是你的错误页面)

我们再来分析看另一种情况:

比如你在请求manager应用时,应用名称写成了Manager或者manageR,这个时候,和上面处理其实一致,这个应用名称,会被识别为/这个应用的一个资源去处理,所以没有该资源自然是返回404

再看一种情况:

manager应用下是有404.jsp这个错误页面的,但你直接以下面的形式去请求,还是会得到404

http://localhost:8080/manager/WEB-INF/jsp/404.jsp

这个大家都知道,是Tomcat内对于目录的访问进行了限制。(WEB-INF目录知多少

再看一种:

你应用内的某个页面,假设是index.jsp内,其本质上要跳转到其它的一个页面,如果是使用sendRedirect还好,跳转后显示具体的路径信息。但假设使用的forward,这个时候,你forward的页面又不存在


这个时候每次请求都会是404,但你看着你请求的页面明明安静的躺在目录里。

 所以,再看到请求返回404的时候,要分情况分析,具体是什么原因导致的,是真的资源找不到,还是其它原因。

甚至还有可能是你配置了多个error code对应到同样一个404的错误页面,你每次看到404,也有可能是其它原因。

相关阅读

你的错误页面。不,是你的错误页面

为什么你的Manager登录不成功?

关于重定向和转发,书上和老师都没告诉你的......

Tomcat是如何响应静态资源的?

你了解Tomcat是怎样处理Jsp文件的吗?

WEB-INF目录知多少

关注Tomcat那些事儿,发现更多精彩文章!了解各种常见问题背后的原理与答案。深入源码,分析细节,内容原创,欢迎关注。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值