通过拦截器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):
定义并配置好好拦截器后,在程序Controller中的接口被访问的时候,相关访问信息就会输出到控制台上,也可以使用日志将访问信息记录到日志中。
记录效果如下所示:
总结:
拦截器通对用户请求进行拦截可以对用户的请求(HttpServletRequest)进行预处理,也可以对返回给用户的响应(HttpServletResponse)进行访问后处理,还可以在请求完成后针对请求的异常信息进行处理。能够在request对象和response对象中进行操作的问题都可以通过拦截器进行统一处理,常用的场景包括用户登录控制、权限检查,跨域请求访问权限控制等。
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对象中进行操作的问题都可以通过拦截器进行统一处理,常用的场景包括用户登录控制、权限检查,跨域请求访问权限控制等。
相关文章推荐
- 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录
- 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录
- 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录
- spring mvc 使用拦截器interceptor和自定义Log类实现持久层记录日志
- struts2的拦截器(3):通过实现Interceptor接口定义自己的拦截器
- Hibernate4 拦截器(Interceptor) 实现实体类增删改的日志记录
- 通过JAVA的main方法直接访问spring mvc 的controller
- spring mvc inteceptor 拦截器实现计算controller 的执行时间
- Spring MVC 中 HandlerInterceptorAdapter的使用[SpringMVC中请求拦截器的实现]
- HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)
- Spring MVC(一)实现Controller接口的控制器
- android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口
- 通过遍历所有的窗口来获取访问记录(实现网页监控)
- Spring MVC拦截器通过注解方式实现防止表单重复提交
- Spring MVC AOP通过注解方式拦截Controller等实现日志管理
- Spring MVC AOP通过自定义注解方式拦截Controller等实现日志管理
- LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例] - 独木桥
- C#中实现zip协议,通过WebRequest查询zip文件内容。统一访问接口
- LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例]
- Spring 拦截器HandlerInterceptor实现对用户操作信息的记录