(客户端)发送请求====>(到服务器端) 过程分析
總過程
第一階段: 客戶端發送請求 通過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)將填充了數據的網頁響應給用戶。
其中整個過程中需要開發人員編寫的部分有Controller、Service、Dao、View;
SpringMVC執行詳解
所以在SpringMVC框架啟動之初,處理器映射器(HandlerMapping)會把所有請求的注解,和他標識的相關方法進行統一的記錄.
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的工作過程是:
當瀏覽器發請求訪問服務器中的某一個Servlet時,服務器將會調用Servlet中的service方法來處理請求。在調用service方法之前會創建出request和response對象。
request和response
其中request對象中封裝了瀏覽器發送給服務器的請求信息(請求行、請求頭、請求實體等),
response對象中將會封裝服務器要發送給瀏覽器的響應信息(狀態行、響應頭、響應實體),在service方法執行完后,服務器再將response中的數據取出,按照HTTP協議的格式發送給瀏覽器。
每次瀏覽器訪問服務器,服務器在調用service方法處理請求之前都會創建request和response對象。(即,服務器每次處理請求都會創建request和response對象)
在請求處理完,響應結束時,服務器會銷毀request和response對象。
總結
以上是生活随笔為你收集整理的(客户端)发送请求====>(到服务器端) 过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 接口怎么响应,Stripe PH
- 下一篇: oracle指令df, oracle