1.Spring Http请求全过程
(1)浏览器的http请求,被Tomcat容器的监听器监听到
(2)请求通过Filter链,到达前置分发器DispatcherServlet
(3)前置分发器DispatcherServlet接收到HTTP请求之后,通过解析HTTP请求的URL获取URI,根据URI从处理器映射HandlerMappings当中获取请求对应的处理器Handler和处理器拦截器HandlerInterceptor
(4)前置分发器DispatcherServlet根据获取得到的Handler选择合适的适配器HandlerAdapter。如果成功获取适配器HandlerAdapter,先调用HandlerInterceptor#preHandler,然后调用处理器Handler,也就是Controller方法
(5)Controller Handler调用Service的业务处理方法
(6)Service调用DAO的数据处理方法
(7)最后依次返回结果
2.过滤器(Filter)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,在HttpSerlvetRequest到底Servlet之前,拦截HttpServletRequest,根据需要检查HttpServletRequest,也可以修改HttpServletRequest Header和数据。主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。
自定义Filter,可以继承该Filter接口或者OncePerRequestFilter接口,然后在接口上面添加@Order(过滤器的顺序)、@WebFilter(过滤器,主要的参数是:filterName 为过滤器名字,urlPatterns 为过滤器的范围,initParams 为过滤器初始化参数)注解。最后在启动类增加注解,自动注册Filter。
Spring结构中主要在ApplicationFilterChain中,进行做Filter循环调用,最后调用到DispatcherServlet#service的方法。
3.HandlerInteceptor
HandlerInterceptor中有三个接口,如下所示
preHandler方法在调用Controller方法之前,根据返回的值,判断是否调用Controller方法
postHandler方法在调用Controller方法之后调用
afterCompletion方法,在request 调用返回之后回调
processDispatchResult中回调afterCompletion