1. 用户发送请求到服务器!
用户在PC端或者手机端,一般通过地址栏发送请求。地址栏输入的信息包括域名和端口号。域名相当于一个服务器在网络中的唯一地址,端口则是地址里的应用位置。如果以现实为例,域名相当于精确到楼层的地址,而端口号就是门牌号。
浏览器首先将地址发给域名解析器进行解析。如果域名解析器给出一个错误的地址,将导致用户无法访问正确的网站,这就是DNS劫持的原理。
浏览器根据域名解析器返回的域名,开始在网络里面寻找对应的地址。如果服务器没有进行特殊处理,网络正常,用户的请求将很会顺利到达服务器。
2. 服务器在正式处理请求之前预处理
服务器获取请求之后,首先启动线程,然后接受请求,即将请求通过IO流传输进服务器,然后处理请求。软件思想皆是来源于生活。这个过程类似于电话客服,首先是有人来接听电话,然后声音通过无线传输到电话另一端,最后客服人员根据听到的请求,开始进行处理。
客服人员首先要判断对方是无理取闹,还是有正当的诉求。所以请求首先要经过一堆的过滤器,进行过滤,将一些危险的请求进行初步的筛选。
以Shiro框架为例,它拦截请求的原理就是配置各种权限的过滤器。只有满足条件的用户才能登录,进入主页。
3. 请求在SpringMvc当中的运行过程
3.1 DispatcherServlet内部处理过程
想要详细了解内部处理的过程,首先推荐通过官网文件进行学习,然后再通过断点追踪,避免在跳转的过程中一头雾水。同时对相关名词不太了解的同学,建议先百度相关概念,先产生认知共识,再学习。
处理过程如下:
DispatcherServlet拦截请求后,调用内部的doDisPatcher方法,这个方法里面有一步是获取处理器(Handler),即获取处理请求的应对措施。举个不恰当的例子,请求是一杯水,应对措施就是给它一杯水,请求是一碗饭,应对措施就是给它一碗饭。源码如下图所示:
Handler的获取,通过HandlerMapping(处理器映射器)。通过请求映射出对应的处理器(Handler)和拦截器(Internal),具体来说是通过遍历BeanName来获取对应的处理器,在SpringMvc中,一般可以把这个Handler认为是Controller层,然后调用相对应的方法。相关的源码如下:
doDisPatcher拿到Handler之后,获取处理器适配器(HandlerAdapter),通过Handleradapter调用相应的方法,获取的响应结果。
3.2 业务处理流程
HandlerAdapter调用相关处理程序,由Controller层进行响应结果和返回请求,Service层进行业务处理,Dao层进行数据操作,最后根据数据库获得的结果,进行相应的封装,由Controller层返回一个封装好的数据Model和相应的视图逻辑字符串,然后封装成(ModelAndView)。部分情况是由于Ajax请求,只要返回数据即可,无需视图。
3.3 视图解析
如果需要返回一个视图,processDispatchResult会先找视图解析器(ViewResolver)进行视图解析,找到对应的视图。就像一个画家想画画,得先给他作画的地方。
然后在View进行Model的渲染,最后将View返回给用户,最终完成一次请求的过程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。