springmvc 多拦截器配置
2017-10-28 12:34
471 查看
//--------------此块内容废话,是这篇文章的产生背景
需求:对所有功能做简单的日志记录, 便于以后统计功能使用情况。
实现方式一:使用aop环绕通知对所有controller、统一异常处理类的访问、响应做横切。 能拿到所有的入参, 重要的是能直接获取到controller的返回值。需要注意的是, 当程序出现异常时环绕通知不会继续执行!!! 所以也需要横切统一异常处理类。
优点:1. 能直接获取controller的返回值
2. 入参,出参等信息可以记录在一条日志中,不会因为其他的请求造成一次请求的日志分离
不足:1. 需要对所有的入口(controller)和出口(controller、统一异常处理, 出口可能有多个)横切
aop日志统计demo: https://github.com/zonaChang/spring-aop-log.git
实现方式二: 使用springmvc拦截器,springmvc的拦截器可以在一次请求达到controller之前和一次请求返回到视图之前执行(已经跳出了controller)。
优点:1. 出口只有一个(请求响应出口),不用理会是从controller或者统一异常响应页面请求的
不足: 1.响应和请求(入参, 出参)的日志不能记录在一条日志中
2. 只能获取到response,但不能直接获取到返回值, 不方便做出参记录。(也可以将出参设置到request中, 然后在postHandle中从request中获取, 需建项目时就要考虑)
最开始想到的是使用方式二“拦截器”,使用的过程中拦截器没有配置成功, 且发现不容易从response中获取返回值内容, 所以放弃了拦截器。 最终使用aop完成日志统计的。
现在将拦截器的配置记录下来
//-------------正文------------------------
多拦截器配置的执行顺序为, 谁先定义,先执行谁的preHandle方法,谁后定义,先执行谁的postHandle方法。且仅当preHandle返回true时,才会指定该拦截器的postHandle方法
命名空间:
applicationContext.xml配置:
Java类: 定义拦截器, 需要使用HandlerInterceptor接口
多拦截器正常访问时方法执行顺序pre1-->pre2--target(controller)-->post2-->post1-->after2-->after1
需求:对所有功能做简单的日志记录, 便于以后统计功能使用情况。
实现方式一:使用aop环绕通知对所有controller、统一异常处理类的访问、响应做横切。 能拿到所有的入参, 重要的是能直接获取到controller的返回值。需要注意的是, 当程序出现异常时环绕通知不会继续执行!!! 所以也需要横切统一异常处理类。
优点:1. 能直接获取controller的返回值
2. 入参,出参等信息可以记录在一条日志中,不会因为其他的请求造成一次请求的日志分离
不足:1. 需要对所有的入口(controller)和出口(controller、统一异常处理, 出口可能有多个)横切
aop日志统计demo: https://github.com/zonaChang/spring-aop-log.git
实现方式二: 使用springmvc拦截器,springmvc的拦截器可以在一次请求达到controller之前和一次请求返回到视图之前执行(已经跳出了controller)。
优点:1. 出口只有一个(请求响应出口),不用理会是从controller或者统一异常响应页面请求的
不足: 1.响应和请求(入参, 出参)的日志不能记录在一条日志中
2. 只能获取到response,但不能直接获取到返回值, 不方便做出参记录。(也可以将出参设置到request中, 然后在postHandle中从request中获取, 需建项目时就要考虑)
最开始想到的是使用方式二“拦截器”,使用的过程中拦截器没有配置成功, 且发现不容易从response中获取返回值内容, 所以放弃了拦截器。 最终使用aop完成日志统计的。
现在将拦截器的配置记录下来
//-------------正文------------------------
多拦截器配置的执行顺序为, 谁先定义,先执行谁的preHandle方法,谁后定义,先执行谁的postHandle方法。且仅当preHandle返回true时,才会指定该拦截器的postHandle方法
命名空间:
xmlns:mvc="http://www.springframework.org/schema/mvc" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
applicationContext.xml配置:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!--拦截所有请求--> <bean class="web.interceptor.ApiInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/held/xx/**"/> <!-- 仅拦截/held/xx开头的所有请求--> <bean class="handheld.controller.base.interceptor.TestInterceptor"/> </mvc:interceptor> </mvc:interceptors>
Java类: 定义拦截器, 需要使用HandlerInterceptor接口
public class TestInterceptor implements HandlerInterceptor @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //默认返回false, 返回true,且目标方法(controller)正常响应数据(没有抛异常)时才能执行到postHandle return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
多拦截器正常访问时方法执行顺序pre1-->pre2--target(controller)-->post2-->post1-->after2-->after1
相关文章推荐
- Springmvc 拦截器的基本配置和使用
- 【Spring】14、SpringMVC拦截器的配置
- springmvc 在web配置了编码拦截器配置
- SpringMVC 配置拦截器 mvc:exclude-mapping 报错的解决办法
- springmvc拦截器的配置、使用
- SpringMVC配置拦截器实现身份认证
- springmvc的拦截器配置
- springmvc拦截器配置和路径问题
- springmvc中如何配置拦截器
- SpringMVC 简单拦截器配置
- 【SpringMVC注解开发】拦截器---拦截器的定义和配置学习笔记十一
- springmvc拦截器的配置、使用
- [SpringMVC整合MyBatis] springmvc拦截器-定义和配置
- SpringMVC第十篇——拦截器的配置和使用
- springMVC拦截器简单配置
- 纯Java配置springmvc中的拦截器
- 第十七章 SpringMVC拦截器配置
- springmvc 全局登陆 拦截器配置
- SpringMVC-intercepter(拦截器)配置
- SpringMVC拦截器配置