DispatcherServlet:
是一个servlet,也就是会被放到tomcat容器中,只不过功能是用来分发。
所有请求,视图解析,映射处理之类的都是通过DispatcherServlet来交给其他组件,最后返回响应给用户。
步骤:
1 | 1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制; |
1 | //根据url调用不同的handler来处理。 |
AbstractHandlerMapping
获得HandlerExecutionChain,以及拦截器的list。
1个url->多个拦截器。1个url->1个handler.
在AbstractHandlerMapping中,
1 | public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { |
AbstractUrlHandlerMapping
从url中找出handler,这里找的是handler,和interceptor不一样。主要就是解决模式匹配的问题:/xxx/*
还有一个url匹配多个Map中的key。
1 | protected Object getHandlerInternal(HttpServletRequest request) throws Exception { |
两个内部拦截器作用:就是将与当前url实际匹配的pattern、匹配条件以及url模板参数等设置到request的属性里面去,这样在后面的处理过程中就可以直接从request属性中获取。
handler可以通过protected void registerHandler(String urlPath, Object handler)
来注册的。
1 | //部分函数 |
拦截器
拦截器的实现:
- 实现HandlerInterceptor
- 继承实现了HandlerInterceptor接口的类。例如:HandlerInterceptorAdapter
HandlerExecutionChain
1 | private final Object handler;//HandlerMethod |
interceptors是在构造函数中直接传入的。最后也会通过CollectionUtils.mergeArrayIntoCollection(interceptors, this.interceptorList);
加到List中
1 | //责任链,返回false,说明不用再往下继续了。之后的controller和interceptor都不用再执行了。直接执行afterCompletion |
- HandlerInterceptorAdapter
实现了AsyncHandlerInterceptor,多了afterConcurrentHandlingStarted():可以处理异步请求。Controller中有异步请求方法时会触发该方法。一般继承这个抽象类 - MappedInterceptor 对某些地址进行排除和包括的拦截器。
- WebInterceptor: 针对请求,参数中没有response,并且没有返回值。
和Filter
的区别:
- Interceptor 是SPring的组件,FIlter是在Servlet容器中。javax.servlet包中。
- FIlter优先于Interceptor执行。
- 总的来说就是不是同一个东西,但是功能相似。在Spring架构中,优先使用拦截器。
Filter方法:
void init(FilterConfig paramFilterConfig)
doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain)
责任链模式,将Chain传递下去void destroy()
销毁资源。
用途:权限检查。