通过HTTP包来再次理解重定向与转发

之所以去看它们之间数据包的差异并不是好奇。我理解它们之间的差异,但是我不知道该如何证明它们之间的差异。想了很久,我觉得去抓包,看它们之间数据包之间的差异,就是一个有力的证据。

预设

总共有三个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);
}

先进行的是重定向,再接着的是转发。

数据包抓取结果以及简要的分析

重定向与转发的数据包如下:
重定向与转发的HTTP数据包分析

首先是第一个数据包,请求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[@EU@?…¯
ð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!

再贴一个结论吧

  • 转发在服务器端完成的;重定向在客户端完成
  • 转发的是同一次请求;重定向是两次不同请求
  • 转发地址栏没有变化;重定向地址栏有变化

猜你喜欢

转载自blog.csdn.net/asahinokawa/article/details/80584405