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

通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录

2016-10-25 17:48 525 查看
java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务处理后给前端返回ModelAndView对象或者只返回Json格式数据。如果能够获得Http请求在后端程序中处理的相关信息,对于开发和调试时十分方便的。工程中使用了Spring MVC的Interceptor对所有Http请求及其响应进行拦截,从而获取到本次访问接口信息以及程序处理时长等信息,特意在此记录一下实现方式。

package com.api.web.interceptor;

import java.util.Arrays;

import java.util.Date;

import java.util.Map;

import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import com.yijia.api.util.SimpleDateFormatCache;

/**

 * 记录信息:</br> 访问时间</br>Controller路径</br>对应方法名</br>请求参数信息</br>请求相对路径</br>请求处理时长

 *

 * @author Administrator

 *

 */

public class TimeCostInterceptor implements HandlerInterceptor {

    // before the actual handler will be executed

    public boolean preHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler) throws Exception {

        long startTime = System.currentTimeMillis();

        request.setAttribute("startTime", startTime);

        if (handler instanceof HandlerMethod) {

            StringBuilder sb = new StringBuilder(1000);

            sb.append("-----------------------").append(SimpleDateFormatCache.getYmdhms().format(new Date()))

                    .append("-------------------------------------\n");

            HandlerMethod h = (HandlerMethod) handler;

            sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");

            sb.append("Method    : ").append(h.getMethod().getName()).append("\n");

            sb.append("Params    : ").append(getParamString(request.getParameterMap())).append("\n");

            sb.append("URI       : ").append(request.getRequestURI()).append("\n");

            System.out.println(sb.toString());

        }

        return true;

    }

    // after the handler is executed

    public void postHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler,

            ModelAndView modelAndView) throws Exception {

        long startTime = (Long) request.getAttribute("startTime");

        long endTime = System.currentTimeMillis();

        long executeTime = endTime - startTime;

        if(handler instanceof HandlerMethod){

            StringBuilder sb = new StringBuilder(1000);

            sb.append("CostTime  : ").append(executeTime).append("ms").append("\n");

            sb.append("-------------------------------------------------------------------------------");

            System.out.println(sb.toString());

        }

    }

    private String getParamString(Map<String, String[]> map) {

        StringBuilder sb = new StringBuilder();

        for(Entry<String,String[]> e:map.entrySet()){

            sb.append(e.getKey()).append("=");

            String[] value = e.getValue();

            if(value != null && value.length == 1){

                sb.append(value[0]).append("\t");

            }else{

                sb.append(Arrays.toString(value)).append("\t");

            }

        }

        return sb.toString();

    }

    public void afterCompletion(HttpServletRequest arg0,

            HttpServletResponse arg1, Object arg2, Exception arg3)

            throws Exception {

    }

}

由于Interceptor是Spring MVC的功能组件,所以需要把此拦截器配置在springmvc的xml配置文件中(或者使用其他配置方式比如javaConfig):

<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 需排除拦截的地址 -->
<mvc:exclude-mapping path="/" />
<mvc:exclude-mapping path="/test" />
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.api.web.interceptor.TimeCostInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>


定义并配置好好拦截器后,在程序Controller中的接口被访问的时候,相关访问信息就会输出到控制台上,也可以使用日志将访问信息记录到日志中。

记录效果如下所示:



 

总结:

拦截器通对用户请求进行拦截可以对用户的请求(HttpServletRequest)进行预处理,也可以对返回给用户的响应(HttpServletResponse)进行访问后处理,还可以在请求完成后针对请求的异常信息进行处理。能够在request对象和response对象中进行操作的问题都可以通过拦截器进行统一处理,常用的场景包括用户登录控制、权限检查,跨域请求访问权限控制等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐