通过HTTP包来再次理解重定向与转发
程序员文章站
2022-05-02 07:53:36
...
之所以去看它们之间数据包的差异并不是好奇。我理解它们之间的差异,但是我不知道该如何证明它们之间的差异。想了很久,我觉得去抓包,看它们之间数据包之间的差异,就是一个有力的证据。
预设
总共有三个servlet
,即/ddgg_ssm/loginre/
、/ddgg_ssm/loginzf
、/ddgg_ssm/user/
,它们的作用依次为重定向到/ddgg_ssm/user/
、转发到/ddgg_ssm/user/
、显示一串字符。简要代码如下:
重定向
@Controller
@RequestMapping("/loginre")
public class LoginController {
@RequestMapping("/*")
@ResponseBody
public void printMsg(HttpServletRequest request, HttpServletResponse response) {
try {
response.sendRedirect("/ddgg_ssm/user/");
} catch (IOException e) {
e.printStackTrace();
}
}
}
转发
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/user/").forward(request, response);
}
先进行的是重定向,再接着的是转发。
数据包抓取结果以及简要的分析
重定向与转发的数据包如下:
首先是第一个数据包,请求loginre
。
GET /ddgg_ssm/loginre/ HTTP/1.1
Host: 172.10.1.39:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; Redmi Note 4X Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.7.2
x-miorigin: b
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
Cookie: JSESSIONID=3AFB73B954FEA21EA30E9F1D5ECF63A4
得到服务器的302重定向响应
HTTP/1.1 302
Location: /ddgg_ssm/user/
Content-Length: 0
Date: Tue, 05 Jun 2018 09:04:57 GMT
浏览器得到重定向的响应后,再请求Location
中的Servlet
。
x+Ëi[@ESàÙ@?;Z
ðeP¬
'£×Ð&ªêÕ`Ã
Á+h¹GET /ddgg_ssm/user/ HTTP/1.1
Host: 172.10.1.39:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; Redmi Note 4X Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.7.2
x-miorigin: b
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
Cookie: JSESSIONID=3AFB73B954FEA21EA30E9F1D5ECF63A4
最后再得到服务器的响应:
[@x+ËiE¶5@@¬
'
ðeP£ªêÕ×Ð(¢ý
+h¼ÁHTTP/1.1 200
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 12
Date: Tue, 05 Jun 2018 09:04:57 GMT
Hello World!
此时浏览器的地址栏已经变成了/ddgg_ssm/user/
。
而后续的转发,只有两个数据包,一个请求与一个响应。
x+Ëi[@aaa@qq.com?…¯
ðeP¬
'£°ÖV)öWyWÖ
×+tÏGET /ddgg_ssm/loginzf HTTP/1.1
Host: 172.10.1.39:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; Redmi Note 4X Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.7.2
x-miorigin: b
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
Cookie: JSESSIONID=3AFB73B954FEA21EA30E9F1D5ECF63A4
得到的响应是/ddgg_ssm/user/
所写入的内容Hello world!
。
[@x+ËiE¶5@@¬
'
ðeP£)öWy°Öw
+tÒ×HTTP/1.1 200
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 12
Date: Tue, 05 Jun 2018 09:05:28 GMT
Hello World!
再贴一个结论吧
- 转发在服务器端完成的;重定向在客户端完成
- 转发的是同一次请求;重定向是两次不同请求
- 转发地址栏没有变化;重定向地址栏有变化
上一篇: MYSQL基操(一)
下一篇: 第二次打卡笔记
推荐阅读