是对 Servlet 的进一步封装,相比于 Servlet 时期需要不断 getParameter ,springMvc只要方法上定义对应名的JavaBean,就可以获取到
处理请求流程—原理
- 有一个统一处理请求的入口
- 通过映射器寻找对应请求地址的适配器
- 找到对应的适配器
- 拦截器前置处理
- 处理请求数据
- 视图解析器处理
- 拦截器后置处理
源码级别顺序
DispatcherServlet(⼊⼝)->DispatcherServlet.properties(会初始化的对象)- >HandlerMapping(映射器)->HandlerExecutionChain(映射器+拦截器List) ->HttpRequestHandlerAdapter(适 配器)->HttpMessageConverter(数据转换
拦截器与过滤器
过滤器是依赖于servlet的,执行逻辑在请求进入tomcat容器后,但请求进入servlet之前进行预处理的;请求结束返回也是,是在servlet处理完后,返回给前端之前
拦截器可以深入到方法的前后、异常抛出前后等更深层次的程度作处理(这里也在一定程度上论证了拦截器是利用java的反射机制实现的),所以在Spring框架中,优先使用拦截器
拦截器先于ApplicationContext加载,所以拦截器无法注入Spring容器管理的bean。
解决办法:拦截器不使用@Component加载,改为使用@Configuration+@Bean加载。
总结:
过滤器:用于属性甄别,对象收集(不可改变过滤对象的属性和行为)
拦截器:用于对象拦截,行为干预(可以改变拦截对象的属性和行为)
拦截器的使用
SpringMVC 中的Interceptor 拦截器的主要作用就是拦截用户的 url 请求,并在执行 handler 方法的前中后加入某些特殊请求,比如通过它来进行权限验证,或者是来判断用户是否登陆。
主要有两种方式:
实现了Spring 的HandlerInterceptor 接口,或者继承实现了HandlerInterceptor接口的类
实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类