目录
认识 "状态码" (status code)
状态码表示访问一个页面的结果
. (
是访问成功
,
还是失败
,
还是其他的一些情况
...).
出现200
这是一个最常见的状态码
,
表示访问成功
.
抓包抓到的大部分结果都是 200例如访问搜狗主页HTTP/1.1 200 OK Server: nginx Date: Thu, 10 Jun 2021 06:07:27 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Vary: Accept-Encoding Set-Cookie: black_passportid=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=.sogou.com Pragma: No-cache Cache-Control: max-age=0 Expires: Thu, 10 Jun 2021 06:07:27 GMT UUID: 80022370-065c-49b0-a970-31bc467ff244 Content-Length: 14805 <!DOCTYPE html><html lang="cn"><head><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,userscalable=no"><script>window._speedMark = new Date(); window.lead_ip = '1.80.175.234'; ......
注意 : 在抓包观察响应数据的时候 , 可能会看到压缩之后的数据 , 形如![]()
网络传输中 "带宽" 是一个稀缺资源, 为了传输效率更高往往会对数据进行压缩.
点击 Fiddler 中的即可进行解压缩, 看到原始的内容 .![]()
403 Forbidden
表示访问被拒绝 . 有的页面通常需要用户具有一定的权限才能访问 ( 登陆后才能访问 ). 如果用户没有登陆直接访问, 就容易见到 403.例如 : 查看码云的私有仓库 , 如果不登陆 , 就会出现 403. 参考链接 : https://gitee.com/HGtz2222/blog_pythonHTTP/1.1 403 Forbidden Date: Thu, 10 Jun 2021 06:05:36 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Keep-Alive: timeout=60 Server: nginx Vary: Accept-Encoding X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff X-UA-Compatible: chrome=1 Expires: Sun, 1 Jan 2000 01:00:00 GMT Pragma: must-revalidate, no-cache, private Cache-Control: no-cache Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041 06:05:40 -0000 Set-Cookie: gitee-session n=ejEvQnYza2RlaXh0KzRaN3QrNWI2TzdLOE03bU5UNjRKdGlqWUFkMlJ2YktWYTRtcEtIVExOZ EdJSFJFSkdiWmcxNmhjSTdneUZFaHFtalNKQUJWcDlUNDZYd2lBaElXNy9FaWRHQkl4d2RsS1RI WnRCNFphQm5JUjZOdjdsSDh5TlNvZ3hZdTBXNXUrU2c2azN2UVNFOWwyQnJvQzZ6MEluaEFFYnR oV0luOFlNWEEzWlR0K1g4WDlQRjNkSlNjZ1pUMGc0YkhreVNJMUV4YkVUUk0weXFqbGhQYzN5dj A2bFJyc3o4MHRVWkkxcHdQVG5abmJ2NmlqV1dEYjlWaUpNNno3UGFpZ3lsb1RqeXAranFHRlE9P S0tdU5JMGZ3UUpwODRYdjF1MXdyYmFKUT09- -52babe9c2dcb63fa02bc32d25bc0e854f4065f5f; domain=.gitee.com; path=/; HttpOnly X-Request-Id: 82a740fb98838c305c4cc597ab6f48c0 X-Runtime: 0.020299 Content-Length: 7092 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>您的访问受限 (403)</title> ......
出现404 404 Not Found
404表示用户访问的资源不存在,大概率是URL的路径写的不正确
错误实例
1
:
少写了
Context Path
通过
/hello
访问服务器
![](https://img-blog.csdnimg.cn/d763d976edb045e099e7f0f830bdad7d.png)
错误实例
2
:
少写了
Servlet Path
通过
/ServletHelloWorld
访问服务器
![](https://img-blog.csdnimg.cn/5b1eced4661243fe8e017f5211ff1089.png)
错误实例
3:
Servlet Path
写的和
URL
不匹配
修改
@WebServlet
注解的路径
![](https://img-blog.csdnimg.cn/9beb95f20ca64a11b3c933b7b732e0c7.png)
重启
Tomcat
服务器
.
URL 中的路径写作 "/hello" , 而代码中写作的 Servlet Path 为 "/helloServlet", 两者不匹配 .
![](https://img-blog.csdnimg.cn/595cd310ef7545a2baf26a865710b8f6.png)
错误实例
4:
web.xml
写错了
清除
web.xml
中的内容
![](https://img-blog.csdnimg.cn/91e1549145ee4d64bf95e3610e8f1fa7.png)
重启
Tomcat
服务器
.
通过浏览器访问
URL,
可以看到
:
![](https://img-blog.csdnimg.cn/2ceaea47997c47d4bc1dcdc4d5153663.png)
在
Tomcat
启动的时候也有相关的错误提示
![](https://img-blog.csdnimg.cn/3eb43ccab7c246c9aedeb462b0e2faf3.png)
出现 405 Method Not Allowed
405
表示对应的
HTTP
请求方法没有实现.
HTTP
中所支持的方法
,
有
GET, POST, PUT, DELETE
等
.
但是对方的服务器不一定都支持所有的方法
(
或者不允许用户使用一些其他的方法
).
错误实例
:
没有实现
doGet
方法
.
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
}
重启 Tomcat 服务器.
在浏览器中访问
,
可以看到
:
![](https://img-blog.csdnimg.cn/b527033cd40844d98693f69c618a27f0.png)
在浏览器地址栏直接输入
URL ,
会发送一个
HTTP GET
请求
.
此时就会根据
/ServletHelloWorld/hello
这个路径找到
HelloServlet
这个类
.
并且尝试调用
HelloServlet
的
doGet
方法
.
但是如果没有实现
doGet
方法
,
就会出现上述现象.
出现 500 Internal Server Error
往往是
Servlet
代码中抛出异常导致的.
服务器出现内部错误
.
一般是服务器的代码执行过程中遇到了一些特殊情况
(
服务器异常崩溃
)
会产生这个状态码.
咱们平时常用的网站很少会出现
500 (
但是偶尔也能看到
).
错误实例
:
修改代码
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String s = null;
resp.getWriter().write(s.length());
}
}
重启
Tomcat
服务器
.
重新访问页面
,
可以看到
:
![](https://img-blog.csdnimg.cn/ae444493d66e46bfad81d553118875ec.png)
在页面上已经有具体的异常调用栈.
异常信息里已经提示了出现异常的代码是 HelloServlet.java 的第 13 行.
resp . getWriter (). write ( s . length ());仔细检查这里的代码就可以看到空指针异常。
504 Gateway Timeout
当服务器负载比较大的时候
,
服务器处理单条请求的时候消耗的时间就会很长
,
就可能会导致出现超时的情况.
这种情况在双十一等 " 秒杀 " 场景中容易出现 , 平时不太容易见到 .
302 Move temporarily
临时重定向
.
理解 " 重定向 "就相当于手机号码中的 " 呼叫转移 " 功能 .比如我本来的手机号是 186-1234-5678, 后来换了个新号码 135-1234-5678, 那么不需要让我的朋友知道新号码,只要我去办理一个呼叫转移业务 , 其他人拨打 186-1234-5678 , 就会自动转移到 135-1234-5678上.
在登陆页面中经常会见到
302.
用于实现登陆成功后自动跳转到主页
.
响应报文的
header
部分会包含一个
Location
字段
,
表示要跳转到哪个页面
.
例如: 码云的登陆页面 https://gitee.com/login
抓包看到的响应结果:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>您的访问受限 (403)</title>
......
可以看到 header 中的 Location: https://gitee.com/HGtz2222 , 接下来浏览器就会自动发送
GET 请求, 获取 https://gitee.com/HGtz2222
301 Moved Permanently
永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.
301 也是通过 Location 字段来表示要重定向到的新地址.
状态码小结
HTTP/1.1 302 Found
Date: Thu, 10 Jun 2021 06:49:26 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=60
Server: nginx
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Location: https://gitee.com/HGtz2222
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041
06:49:24 -0000
Set-Cookie: gitee_user=true; path=/
Set-Cookie: gitee-sessionn=UG5CdVZQUkVUamxsWis3b0JoL2dyTDRLVTk1WXVCK2VwaGd0OGFKdjBjdjB4K0RiWTh2ZmhrZ
GM1cU0vOFN2VGdNcVY5dU5rSzZHeVFBcVZ3OTBaSmZmZzRYQUdsa2tHMnFIeU9SQlN4Z2pleDNM
Y3ExZUF6QWpHTHlVeTZOWFVHSVBxbTVuZGJpandHekdaRVBTUVd0ejZUNHNvTllSODBiNHd6NWN
CRUZ0UzZCZW1mRTBZUUdmOE5JTWVKdnJMMzdQcHFBMk5nUmNjMWpmc3daTElYU2hhbkEwQm41NH
NlZ2RwM3QxSjZMTndSNjcyNDd6YUVoS0ZmUWpLTDQ2KzlzZVowZTFLaUNPTmVDajVOb2k0MWFRc
GkzWVQ2QUxuWXJLeTRqL2JHaUE9LS0xYlVDOWVkc0JiM2xucVk0am1LRHFnPT0%3D-
-58854ce81d6c67bb7b9a0fdd6fe18a8ebdb3d753; domain=.gitee.com; path=/;
HttpOnly
X-Request-Id: d45ade01dbeffc99a3688d3411b3381f
X-Runtime: 0.133587
Content-Length: 92
<html><body>You are being <a
href="https://gitee.com/HGtz2222">redirected</a>.</body></html>
可以看到 header 中的 Location: https://gitee.com/HGtz2222 , 接下来浏览器就会自动发送
GET 请求, 获取 https://gitee.com/HGtz2222
301 Moved Permanently
永久重定向
.
当浏览器收到这种响应时
,
后续的请求都会被自动改成新的地址
.
301
也是通过
Location
字段来表示要重定向到的新地址
.
出现 "空白页面"
错误实例
:
修改代码
,
去掉
resp.getWritter().write()
操作
.
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("hello");
}
}
重启服务器, 访问服务器, 可以看到一个空白页面:
![](https://img-blog.csdnimg.cn/c8004fb807b4466aa14abf63902802e0.png)
抓包可以看到
,
响应
body
中的内容就是
"
空数据
"
![](https://img-blog.csdnimg.cn/6d53620556dc49d5b03c0db3908814fe.png)
出现 "无法访问此网站"
一般是 Tomcat 启动就失败了.
错误实例: Servlet Path 写错了.
应该写作 "/hello", Tomcat 在启动的时候已经提示了相关的错误 .Tomcat 启动的日志里面报错信息可能比较多 , 需要耐心观察 , 找到关键的提示 .
![](https://img-blog.csdnimg.cn/08395deea03540ad8a4136b16f953e6e.png)
看到的现象:
熟悉
HTTP
协议能够让我们调试问题事半功倍
.
- 4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
- 5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
- 出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.
- 空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.