欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过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);
}

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

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

重定向与转发的数据包如下:
通过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[@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!

再贴一个结论吧

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