博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录
阅读量:4621 次
发布时间:2019-06-09

本文共 4137 字,大约阅读时间需要 13 分钟。

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  * 记录信息:
访问时间
Controller路径
对应方法名
请求参数信息
请求相对路径
请求处理时长20 * 21 * @author Administrator22 * 23 */24 public class TimeCostInterceptor implements HandlerInterceptor {25 26 // before the actual handler will be executed27 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 executed47 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
map) {62 StringBuilder sb = new StringBuilder();63 for(Entry
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):

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

记录效果如下所示:

 

总结:

拦截器通对用户请求进行拦截可以对用户的请求(HttpServletRequest)进行预处理,也可以对返回给用户的响应(HttpServletResponse)进行访问后处理,还可以在请求完成后针对请求的异常信息进行处理。能够在request对象和response对象中进行操作的问题都可以通过拦截器进行统一处理,常用的场景包括用户登录控制、权限检查,跨域请求访问权限控制等。 

转载于:https://www.cnblogs.com/gl-developer/p/5997508.html

你可能感兴趣的文章
讨论Spring整合Mybatis时一级缓存失效得问题
查看>>
Maven私服配置Setting和Pom文件
查看>>
Linux搭建Nexus3.X构建maven私服
查看>>
NPOI 操作Excel
查看>>
MySql【Error笔记】
查看>>
vue入门
查看>>
JS线程Web worker
查看>>
Flex的动画效果与变换!(三)(完)
查看>>
mysql常见错误码
查看>>
Openresty 与 Tengine
查看>>
使用XV-11激光雷达做hector_slam
查看>>
布局技巧4:使用ViewStub
查看>>
学习记事
查看>>
java 子类重写父类的方法应注意的问题
查看>>
[LevelDB] LevelDB理论基础
查看>>
【codecombat】 试玩全攻略 第一关kithguard地牢
查看>>
【DP】 POJ 1191 棋盘分割 记忆化搜索
查看>>
自动化测试 Appium之Python运行环境搭建 Part2
查看>>
说说DBA职责和目标
查看>>
从头认识Spring-2.4 基于java的标准注解装配-@Inject-限定器@Named
查看>>