需求:在项目开发快要结束时,需要在返回给前端的数据中添加请求时间、返回时间和请求耗时。
第一步:拦截器在request请求中添加请求时间
@Component
public class RequestInterceptor implements HandlerInterceptor{
//处理请求前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String method = request.getMethod();
if(method.equals("OPTIONS")) {
response.setStatus(200);
return true;
}
String reqUrl = request.getRequestURI();
System.out.println("接口访问URL----->" + reqUrl);
long reqTime = System.currentTimeMillis();
request.setAttribute("reqTime", reqTime);
request.setAttribute("reqUrl", reqUrl);
return true;
}
//处理请求后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
// System.out.println("----------------postHandle");
}
//响应后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
// System.out.println("----------------afterHandle");
}
}
第二步:在返回数据类型中添加需要的数据
@ControllerAdvice
public class GetResponseBody implements ResponseBodyAdvice<Object> {
@SuppressWarnings("rawtypes")
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@SuppressWarnings("rawtypes")
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
//通过RequestContextHolder获取request
HttpServletRequest httpServletRequest =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//添加请求时间和返回时间,计算接口总耗时
if(body instanceof ResultData){
String reqTime = httpServletRequest.getAttribute("reqTime").toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
((ResultData) body).setReqTime(sdf.format(new Date(Long.valueOf(reqTime))));
long respTime = System.currentTimeMillis();
((ResultData) body).setRespTime(sdf.format(new Date(respTime)));
}
return body;
}
}