之前一段时间和各位师傅(py3rd师傅、iswin师傅、orich1师傅、廖大)聊了一下,感觉目前市场上对Spring Web这方面的安全非常看重。前段时间校招,不少学弟也给我说现在面试官起手就是问Spring安全方面的一些东西,感觉现在各家都比较需要这方面的人。我听了之后还蛮尴尬的,我作为一个面试官扪心自问,是对Spring安全这方面是没有什么理解的。本着菜就要学的原则,准备自己挖个坑把Spring MVC好好看看,加深一下自己对Spring Web这方面的理解。
对于Spring Web框架的安全,我目前的理解还停留在SPEL表达式注入、jolokia利用、spring-oxm XStream反序列化这个层面上,因为Spring Web很多功能是交由组件来实现的,比如spring-oxm XStream反序列化的利用,其根本原因还是XStream反序列化的应用,和Spring MVC的关系真的不大。如果说学弟面对的这个Spring Web安全是利用Spring Web框架写的web应用的安全性的话,那其实就是另外一个话题了,就属于常规的业务代码审计了,很多时候和Spring Web框架的关系就不大了。
所以还是比较想了解一下这些面试官是否对这个名词有什么新的理解,还只是单纯的走个流程问一下。xD
以上为个人的自问,与要干的事没什么关系。其实一直都想好好的看一遍SpringMVC,感受一下设计理念被各个语言都抄了一遍的Web框架到底有什么样的魅力(Django是参考SpringMvc设计的,Laravel是参考Django实现的)。之前在研究OGNL的时候大致跟了一遍Strut2,以xwork2为核心的框架设计模式在前端控制器与后端的通信上谈不上优雅,大量繁琐的逻辑在看的时候都会很苦恼,那么SpringMVC的设计模式是什么样的呢?
在对SpringMVC进行深入研究前,首先来看一下SpringMVC的基础构成,这里用一张最基础的图来进行说明:
SpringMVC和其他的Java Web框架类似,所有的请求都会通过一个前端控制器( front controller
)Servlet, 其本身不承担功能处理,它的作用是将请求委托给应用程序的其他组件来执行 ,简单来说可以将前端控制器Servlet理解为一个调度器进行全局流程控制。
在SpringMVC中承担前端控制器功能的,就是 DispatcherServlet
。所以想要完全的理解SpringMVC的工作流程,就要从 DispatcherServlet
这个核心点入手。
在对整个流程有了个大致概念后,不妨更细致的看看SpringMVC的构成:
以 DispatcherServlet
为核心调度器,当一个新的请求进入时将会触发以下流程:
DispatcherServlet
构建Spring应用上下文,加载并配置bean完成初始化过程。 HandlerAdapter
将 Handler
(处理器)和 HandlerInterceptor
(处理器拦截器)包装成 HandlerAdapter
这个适配器类型。这里利用了适配器设计模式,方便支持多种类型的处理器。 DispatcherServlet
通过 HandlerMapping
将请求映射为 HandlerExecutionChain
对象,该对象包括 Handler
及相应的 HandlerInterceptor
。对应简略图中的1。 DispatcherServlet
利用 HandlerAdapter
匹配符合要求的适配结果。之后将根据适配结果调用真正的 Controller
进行逻辑处理并完成相应功能。最后将返回一个 ModelAndView
对象,该对象包含数据( Model
的数据)以及逻辑视图名( View
的名称)。对应简略图中的2、3。 DispatcherServlet
初始化中所设定的 ViewResolver
(视图解析器)把逻辑视图名解析为具体的 View
对象。对应简略图中的4。 View
对象会根据传入的 Model
数据进行渲染。对应简略图中的5。 DispatcherServlet
,由其控制返回渲染后的 View
返回给用户。 这里对于 HandlerExecutionChain
这个执行链多说两句。 HandlerExecutionChain
其实就是通过 HandlerMapping
将 Handler
和 HandlerInterceptor
进行了组装,关键的流程还是由 HandlerInterceptor
来管控的。
HandlerInterceptor
允许自定义处理程序的执行链。其类似于Servlet的过滤器,但是与后者比它仅允许:
从其方法列表中我们也能看出其主要的功能:
所以整理一下 HandlerExecutionChain
的处理逻辑,就如下图所示:
根据上面对SpringMVC整个流程的总结,可以看到SpringMVC是以 DispatcherServlet
为核心,将整个框架组装调度了起来,所以后面几篇研究SpringMVC的文章都是以 DispatcherServlet
入手进行跟踪的。