springmvc拦截器使用和原理理解
springmvc拦截器使用和原理理解
与struts2类似,springmvc的拦截器主要作用也是在服务端真正处理请求前后进行一些相关的操作。 例如初始化资源,权限监控,会话设置,菜单获取,资源清理等。
步骤:
1. 自定义拦截器
自定义拦截器一般继承自HandlerInterceptorAdapter 或者实现 HandlerInterceptor 接口。 实现接口需要实现对应的3中方法,继承父类只需要实现需要的方法即可。preHandle,postHandle,afterCompletion
2.xml文件中配置拦截器
定义好拦截器后,在xml文件中进行声明和添加过滤规则。
<mvc:interceptors>
<!-- 写在外面,表示拦截所有链接 -->
<bean id="" class=""/>
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 排除拦截的链接 -->
<mvc:exclude-mapping path="/static/**" />
<bean class="拦截器java代码路径" />
</mvc:interceptor>
</mvc:interceptors>
至此,springmvc的简单使用就是这样。
3.springmvc原理
SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所有的操作都是通过该servlet进行的顺序操作,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也没有代理。哪不难想到我们在执行controller之前做某些动作,执行完毕做某些动作,render完成做某些动作,都是servlet在开始便策划好的。SpringMVC的拦截器对应提供了三个preHandle,postHandle,afterCompletion方法。
4. 拦截器与过滤器的区别
过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。 拦截器:依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。 附上一张servlet执行顺序图(摘录):
5. struts2与springmvc拦截器不同之处
struts2的自定义拦截器主要有三个方法:init(),intercept(),destroy() springmvc自定义拦截器同样有三个方法:preHandle,postHandle,afterCompletion
struts2三个方法主要区别:
Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。 Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。 Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
springmvc三个方法主要区别:略(上面已经讲过)
