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

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

 1 package com.api.web.interceptor;
 2
 3 import java.util.Arrays;
 4 import java.util.Date;
 5 import java.util.Map;
 6 import java.util.Map.Entry;
 7
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10
11 import org.apache.log4j.Logger;
12 import org.springframework.web.method.HandlerMethod;
13 import org.springframework.web.servlet.HandlerInterceptor;
14 import org.springframework.web.servlet.ModelAndView;
15
16 import com.yijia.api.util.SimpleDateFormatCache;
17
18 /**
19  * 记录信息:</br> 访问时间</br>Controller路径</br>对应方法名</br>请求参数信息</br>请求相对路径</br>请求处理时长
20  *
21  * @author Administrator
22  *
23  */
24 public class TimeCostInterceptor implements HandlerInterceptor {
25
26     // before the actual handler will be executed
27     public boolean preHandle(HttpServletRequest request,
28             HttpServletResponse response, Object handler) throws Exception {
29         long startTime = System.currentTimeMillis();
30         request.setAttribute("startTime", startTime);
31         if (handler instanceof HandlerMethod) {
32             StringBuilder sb = new StringBuilder(1000);
33
34             sb.append("-----------------------").append(SimpleDateFormatCache.getYmdhms().format(new Date()))
35                     .append("-------------------------------------\n");
36             HandlerMethod h = (HandlerMethod) handler;
37             sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");
38             sb.append("Method    : ").append(h.getMethod().getName()).append("\n");
39             sb.append("Params    : ").append(getParamString(request.getParameterMap())).append("\n");
40             sb.append("URI       : ").append(request.getRequestURI()).append("\n");
41             System.out.println(sb.toString());
42         }
43         return true;
44     }
45
46     // after the handler is executed
47     public void postHandle(HttpServletRequest request,
48             HttpServletResponse response, Object handler,
49             ModelAndView modelAndView) throws Exception {
50         long startTime = (Long) request.getAttribute("startTime");
51         long endTime = System.currentTimeMillis();
52         long executeTime = endTime - startTime;
53         if(handler instanceof HandlerMethod){
54             StringBuilder sb = new StringBuilder(1000);
55             sb.append("CostTime  : ").append(executeTime).append("ms").append("\n");
56             sb.append("-------------------------------------------------------------------------------");
57             System.out.println(sb.toString());
58         }
59     }
60
61     private String getParamString(Map<String, String[]> map) {
62         StringBuilder sb = new StringBuilder();
63         for(Entry<String,String[]> e:map.entrySet()){
64             sb.append(e.getKey()).append("=");
65             String[] value = e.getValue();
66             if(value != null && value.length == 1){
67                 sb.append(value[0]).append("\t");
68             }else{
69                 sb.append(Arrays.toString(value)).append("\t");
70             }
71         }
72         return sb.toString();
73     }
74
75     public void afterCompletion(HttpServletRequest arg0,
76             HttpServletResponse arg1, Object arg2, Exception arg3)
77             throws Exception {
78
79     }
80 }

由于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对象中进行操作的问题都可以通过拦截器进行统一处理,常用的场景包括用户登录控制、权限检查,跨域请求访问权限控制等。

时间: 2024-10-16 14:21:44

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

spring mvc 中web.xml配置信息解释

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servlet

spring MVC中controller失效

好久没有编程了,最近配置了一个springMVC的项目,结果controller失效了,任何路径都不拦截,呕死我了... 结果发现是springMVC配置处出了问题,springMVC的配置有两种: 一种是: 1 <bean 2 class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 3 <property name="messageConv

Spring MVC中 controller方法返回值

1.返回ModelAndView 定义ModelAndView对象并返回,对象中可添加model数据.指定view 2.返回String 1.表示返回逻辑视图名 model对象通过 model.addAttribute("xxx",model)进行设定 2.redirect重定向: redirect重定向特点:浏览器地址栏中的url会变化.修改提交的request数据无法传到重定向的地址.因为重定向后重新进行request(request无法共享) 3.forward页面转发: 通过f

Spring mvc中自定义拦截器

一.要实现的一个功能: 1.打开特定的一些页面时必需强制用户进行登录. 2.登录后再返回到之前的页面. 二.先写一个service,实现从cookie中判断用户是否登录. 1.TT_TOKEN为登录成功时,响应给浏览器的Cookie的键. @Service public class UserServiceImpl implements UserService{ @Value("${SSO_BASE_URL}") private String SSO_BASE_URL; @Value(&

详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

1 前言 昨天新接了一个需要,"拦截 XXX,然后 OOO",好吧,说白了就是要用拦截器干点事(实现一个具体的功能).之前,也在网络上搜了很多关于Interceptor的文章,但感觉内容都大同小异,而且知识点零零散散,不太方便阅读.因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,以供大家参考阅读. 2 拦截器 2.1 概念 Java 里的拦截器是动态拦截 action 调用的对象.它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个

Spring MVC中的拦截器Interceptor

谈谈spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先设置数据以及统计方法的执行效率等等.今天就来详细的谈一下spring中的拦截器.spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor. 一,HandlerInterceptor拦截器 HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行.实现一个Ha

Spring MVC中拦截器HandlerInterceptorAdapter中的preHandle方法

拦截器:顾名思义,就是对请求进行拦截,做一些预处理.后处理或返回处理的操作 Spring MVC中使用拦截器的方法,继承HandlerInterceptorAdapter类,并根据需求实现其中的preHandle方法(预处理).postHandle方法(返回处理),afterCompletion方法(后处理). public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object han

spring mvc中的拦截器小结 .

在spring mvc中,拦截器其实比较简单了,下面简单小结并demo下. preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现):      返回值:true表示继续流程(如调用下一个拦截器或处理器):              false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应: postHandle:后处理回调方法,实现处理器的后处理(但在渲

Java三大器之拦截器(Interceptor)的实现原理及代码示例

前言:前面2篇博客,我们分析了Java中过滤器和监听器的实现原理,今天我们来看看拦截器. 1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式.在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作.目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器