日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(客户端)发送请求====>(到服务器端) 过程分析

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (客户端)发送请求====>(到服务器端) 过程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總過程

第一階段: 客戶端發送請求 通過DNS解析找到具體的ip地址和端口號
第二階段: webserver(Tomca中間件)----->DispatcherServlet
第三階段:springmvc處理請,求并響應結果返還給客戶端

第一階段 :DNS映射

具體什么是DNS?

DNS( Domain Name System)是“域名系統”的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用于TCP/IP網絡,它所提供的服務是用來將主機名和域名轉換為IP地址的工作。DNS就是這樣的一位“翻譯官”,有人說DNS就是一個本大得電話本,說的也挺貼切 它的基本工作原理可用下圖來表示。

Dns服務的工作過程

我們在瀏覽器訪問www.baidu.com這個域名,dns怎么查詢到這臺主機那?

1、在瀏覽器中輸入www.baidu.com域名,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關系,如果有,就先調用這個ip地址映射,完成域名解析。

2、如果hosts里沒有這個域名的映射,則會查找本地DNS解析器緩存,是否有這個網址映射關系,如果有,直接返回,完成域名解析。

3、如果hosts與本地DNS解析器緩存都沒有相應的網址映射關系,首先會找TCP/IP參數中設置的首選DNS服務器,在此我們叫它本地DNS服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析記過給客戶端,完成域名解析,此解析具有權威性。

4、如果要查詢域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關系,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。

5、如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求后會判斷這個域名(.com)是誰來授權管理,并會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息后,將會聯系負責.com域的這臺服務器。這臺負責.com域的服務器收到請求后,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(baidu.com)給本地DNS服務器。當本地DNS服務器收到這個地址后,就會找baidu.com域服務器,重復上面的動作,進行查詢,直至找到www.baidu.com主機。

6、如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根DNS或把請求轉至上上級,以此循環。不管是本地DNS服務器用是轉發,還是根提示,最后都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。

DNS域名

第二階段: webserver(Tomca中間件)----->DispatcherServlet

客戶端訪問網址,服務器端頁面響應 --------通過sts斷點分析



1.初始化會開啟一些守護線程

2.線程池 取出相關線程處理請求

3.io流讀取 socket 封裝的HTTP請求數據

4服務器會調用Servlet中的service方法,把瀏覽器發送給服務器的請求信息信息封裝到Request對象中

5.過濾器filter
6.DispatcherServlet前端控制器

第三階段:springmvc處理請求,并響應結果返還給客戶端

springmvc執行原理
(1).用戶發送請求 至 前端控制器(DispatcherServlet);
提示:DispatcherServlet的作用:接收請求,調用其它組件處理請求,響應結果,相當于轉發器、中央處理器,是整個流程控制的中心

(2).前端控制器(DispatcherServlet)收到請求后調用處理器映射器(HandlerMapping)
處理器映射器(HandlerMapping)找到具體的Controller(可以根據xml配置、注解進行查找),并將Controller返回給DispatcherServlet;

(3).前端控制器(DispatcherServlet)調用處理器適配器(HandlerAdapter)。處理器適配器經過適配調用具體的Controller;(Controller–> service --> Dao --> 數據庫)
Controller執行完成后返回ModelAndView,
提示:Model(模型數據,即Controller處理的結果,Map) View(邏輯視圖名,即負責展示結果的JSP頁面的名字)
處理器適配器(HandlerAdapter)將controller執行的結果(ModelAndView)返回給前端控制器(DispatcherServlet);

(4).前端控制器(DispatcherServlet)將執行的結果(ModelAndView)傳給視圖解析器(ViewReslover)
視圖解析器(ViewReslover)根據View(邏輯視圖名)解析后返回具體JSP頁面

(5).前端控制器(DispatcherServlet)根據Model對View進行渲染(即將模型數據填充至視圖中);
前端控制器(DispatcherServlet)將填充了數據的網頁響應給用戶。
其中整個過程中需要開發人員編寫的部分有ControllerServiceDaoView;

SpringMVC執行詳解

  • 在SpringMVC框架啟動之初,程序會對處理器映射器(HandlerMapping)的進行實例化,其中處理器映射器(HandlerMapping)中會有一個map的結構類型.其中map中的key存儲的是你要攔截請求路徑,value存儲的是你要具體要執行的請求方法.
    所以在SpringMVC框架啟動之初,處理器映射器(HandlerMapping)會把所有請求的注解,和他標識的相關方法進行統一的記錄.
  • 如果有用戶發來請求,首先會被前端控制器(DispatcherServlet所攔截,前端控制器(DispatcherServlet)收到請求后調用處理器映射器(HandlerMapping),通過相關路徑匹配,找到具體的Controller(可以根據xml配),并將Controller返回給DispatcherServlet;
  • 前端控制器(DispatcherServlet)調用處理器適配器(HandlerAdapter)。處理器適配器根據你標識的注解,調用相對應的handler處理器,由這個handler處理器來做具體的調用.Controller;(Controller–>service --> Dao --> 數據庫) 最后將controller執行的結果(ModelAndView)對象返回給前端控制器(DispatcherServlet);
  • 前端控制器(DispatcherServlet)將執行的結果(ModelAndView)傳給視圖解析器(ViewReslover)視圖解析器(ViewReslover)根據View(邏輯視圖名)解析后返回具體JSP頁面
  • 前端控制器(DispatcherServlet)根據Model對View進行渲染(即將模型數據填充至視圖中); 前端控制器(DispatcherServlet)將填充了數據的網頁響應給用戶。
  • Spring MVC中的攔截器

    Spring MVC中的攔截器基于回調機制,可以在目標方法執行之前,先進行業務檢測,滿足條件則放行,不滿足條件則進行攔截,攔截器原理分析如下圖所示:


    SpringMVC攔截器工作原理

    HandlerInterceptor

    案例

    HandlerInterceptor 攔截器

    @Component //spring容器管理對象 public class UserInterceptor implements HandlerInterceptor {@Autowiredprivate JedisCluster jedisCluster;//Spring版本升級 4 必須實現所有的方法 spring 5 只需要重寫指定的方法即可./*** 需求: 攔截/cart開頭的所有的請求進行攔截.,并且校驗用戶是否登錄.....* 攔截器選擇: preHandler* 如何判斷用戶是否登錄: 1.檢查cookie信息 2.檢查Redis中是否有記錄.* true : 請求應該放行* false: 請求應該攔截 則配合重定向的語法實現頁面跳轉到登錄頁面 使得程序流轉起來*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.判斷用戶是否登錄 檢查cookie是否有值String ticket = CookieUtil.getCookieValue(request,"JT_TICKET");//2.校驗ticketif(!StringUtils.isEmpty(ticket)){//3.判斷redis中是否有值.if(jedisCluster.exists(ticket)){//4.動態獲取json信息String userJSON = jedisCluster.get(ticket);User user = ObjectMapperUtil.toObj(userJSON,User.class);request.setAttribute("JT_USER",user);return true;}}response.sendRedirect("/user/login.html");return false;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//銷毀數據request.removeAttribute("JT_USER");} }

    WebMvcConfigurer— springmvc 配置類

    @Configuration public class MvcConfigurer implements WebMvcConfigurer{//添加攔截器@Autowiredprivate UserInterceptor userInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(userInterceptor).addPathPatterns("/cart/**","/order/**");}}

    各種攔截器Filer

    另:servlet回顧

    Servlet本質

    Servlet本質是一段運行在服務器端的Java程序,

    和之前的Java程序不同的是,Servlet程序無法獨立運行,需要將Servlet程序放在服務器中(比如tomcat服務器),由服務器調用才可以執行。
    SpringMVC基于Servlet進行封裝的框架

    servlet的生命周期

    1.加載和實例化
    2.初始化
    3.請求處理
    4.服務終止

    Web服務器在與客戶端交互時Servlet的工作過程是:

  • 在客戶端對web服務器發出請求
  • web服務器接收到請求后將其發送給Servlet
  • Servlet容器為此產生一個實例對象并調用ServletAPI中相應的方法來對客戶端HTTP請求進行處理,然后將處理的響應結果返回給WEB服務器.
  • web服務器將從Servlet實例對象中收到的響應結構發送回客戶端.
    當瀏覽器發請求訪問服務器中的某一個Servlet時,服務器將會調用Servlet中的service方法來處理請求。在調用service方法之前會創建出request和response對象。
  • request和response

    其中request對象中封裝了瀏覽器發送給服務器的請求信息(請求行、請求頭、請求實體等),
    response對象中將會封裝服務器要發送給瀏覽器的響應信息(狀態行、響應頭、響應實體),在service方法執行完后,服務器再將response中的數據取出,按照HTTP協議的格式發送給瀏覽器。

    每次瀏覽器訪問服務器,服務器在調用service方法處理請求之前都會創建request和response對象。(即,服務器每次處理請求都會創建request和response對象)

    在請求處理完,響應結束時,服務器會銷毀request和response對象。

    總結

    以上是生活随笔為你收集整理的(客户端)发送请求====>(到服务器端) 过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。