您的位置:首页 > 编程语言 > Java开发

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方法

命名空间:

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拦截器