springmvc 多拦截器配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/changerzhuo_319/article/details/78374727

//--------------此块内容废话,是这篇文章的产生背景

需求:对所有功能做简单的日志记录, 便于以后统计功能使用情况。

实现方式一:使用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

没有更多推荐了,返回首页