在网页上点击一个按钮到服务器的整个流程-
发布日期:2021-07-20 20:54:03 浏览次数:41 分类:技术文章

本文共 2479 字,大约阅读时间需要 8 分钟。

也可以理解为一个http请求的完整流程,一般点击按钮交互分为超链接跳转、表单提交、或者异步的获取数据。下面以超链接跳转 为例

  1. 域名解析(DNS解析):逐级从浏览器、本地操作系统、路由器、电信运营商缓存,还找不到,电信运营商会根据域名去对应的域名服务器查找IP信息
  • 浏览器缓存中查找,不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)(可以通过chrome://net-internals/#dns查看)
  • 系统缓存:如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。( ipconfig /displaydns 来查看)
  • 路由器缓存:接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
  • ISP DNS 缓存(电信运营商缓存):接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
  • 递归搜索: 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了
  1. TCP三次握手(已经DNS解析了域名对应IP,请求URL地址了面有端口,默认80,这样就可以实现TCP连接了)

  2. 成功建立TCP连接开始通讯

  3. 浏览器发起HTTP请求,一个完整的http请求信息由3部分组成:请求行、请求头部、请求数据

  • 请求行:Request Method(GET、POST、PUT、DELETE等)、Request URL、请求的协议(http1.0、http1.1,现在浏览器大部分默认都是http1.1协议)
  • 请求头部:Connection属性、Accept Encoding(服务端可以发送的压缩数据的格式)、Accept Charset等信息
  • 请求数据:get请求的话就是空的,post请求里面就会有请求的相关参数和参数值
  1. 服务器处理收到的请求
  • 一般第一层是nginx服务器,Nginx根据URL在Nginx本地查找是否有代理层本地缓存,如果没有缓存,再根据反向代理的规则,分配给对应的资源来处理
  • 如果有用到Zuul的话,可能还需要第二层网关,来找到对应的后台来处理请求
  • 普通动态请求的话,如果Spring MVC框架,流程如下,主要是DispatcherServlet控制器,控制整个流程。
1. 客户端用户发送请求至前端控制器DispatcherServlet。    2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。    3. HandlerMapping处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。    4. DispatcherServlet调用HandlerAdapter处理器适配器,HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。    5. Controller控制器执行完成返回ModelAndView,HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。    6. DispatcherServlet前端控制器将ModelAndView传给ViewReslover视图解析器。    7. ViewReslover解析后返回具体View,会根据配置的不同而使用不同的ViewReslover,比如JSP文件的InternalResourceViewResolver、FreeMaker文件的FreeMarkerViewResolver     8. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中),并返回给客户端用户
  • MVC的过程中会调用Controller层的代码(忽略了一些MVC如何配置的一些细节:比如web.xml中DispatcherServlet的配置,和component-scan、InternalResourceViewResolver的配置,MVC的Bean的暴露,和参数的传递)

  • Controller层又是通过Spring IOC的依赖注入,注入了Server层的Bean,这里包括三个知识点:1. Spring MVC基于父子容器的实现(Mvc子容器可以任意注入Spring 父容器中的Bean,但是父容器无法引用MVC子容器里面注入的Bean)2. Spring IOC注册Bean的原理 3. Spring 框架如何在Tomcat等web容器下启动原理

  • 引用了Service层的Bean,处理业务,再到Dao层,通过ORM框架,比如Mybatis(原理还是封装的JDBC连接)和数据库交互

  • 静态资源请求的话(html、css、图片等),可能就直接从对应的文件路径里面返回了

  1. 服务器返回一个响应报文,响应报文包括:状态行、响应头部、响应正文
  • 状态行:请求协议、状态码、状态码描述 ,比如 HTTP1.1 200 OK
  • 响应头部:Content-Type(Server: Apache/2.2.8 PHP/5.2.5)、Content-Length、Content-Charset等信息
  • 响应正文:内容可能是html、js、css等等
  1. 浏览器解析html代码并请求html中的js/css/图片等资源
  2. 浏览器进行页面渲染呈现给用户
  3. 数据传输完毕,TCP 4次挥手断开连接。因为现在的浏览器默认都是Http1.1协议(长连接,keepalive=true),这样可以避免传输一个多段的数据频繁的创建TCP连接。而连接的断开一般是由服务器来控制的,最后发送一个空白行表示一个消息数据全部发送完成,然后四次挥手断开TPC连接。

参考资料

转载地址:https://blog.csdn.net/liao0801_123/article/details/89451179 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:windows下搭建drools workbench(可视化配置)及drools语法
下一篇:MongoDB如何进行数据库(表)设计?

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月21日 11时55分58秒