之所以去看它们之间数据包的差异并不是好奇。我理解它们之间的差异,但是我不知道该如何证明它们之间的差异。想了很久,我觉得去抓包,看它们之间数据包之间的差异,就是一个有力的证据。
预设
总共有三个servlet
,即/ddgg_ssm/loginre/
、/ddgg_ssm/loginzf
、/ddgg_ssm/user/
,它们的作用依次为重定向到/ddgg_ssm/user/
、转发到/ddgg_ssm/user/
、显示一串字符。简要代码如下:
重定向
1 2 3 4 5 6 7 8 9 10 11 12 13
| @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(); } } }
|
转发
1 2 3
| protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/user/").forward(request, response); }
|
先进行的是重定向,再接着的是转发。
数据包抓取结果以及简要的分析
重定向与转发的数据包如下:

首先是第一个数据包,请求loginre
。
1 2 3 4 5 6 7 8 9 10
| 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重定向响应
1 2 3 4
| HTTP/1.1 302 Location: /ddgg_ssm/user/ Content-Length: 0 Date: Tue, 05 Jun 2018 09:04:57 GMT
|
浏览器得到重定向的响应后,再请求Location
中的Servlet
。
1 2 3 4 5 6 7 8 9 10
| 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
|
最后再得到服务器的响应:
1 2 3 4 5 6
| 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/
。
而后续的转发,只有两个数据包,一个请求与一个响应。
1 2 3 4 5 6 7 8 9 10
| 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!
。
1 2 3 4 5 6
| 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!
|
再贴一个结论吧
- 转发在服务器端完成的;重定向在客户端完成
- 转发的是同一次请求;重定向是两次不同请求
- 转发地址栏没有变化;重定向地址栏有变化