以spring boot为例,注意拦截器是单例 ,因此不要使用成员变量记录时间,而是通过setAttribute,getAttribute来传送时间。
@Configuration
public class BootWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new BootInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
/***
* 拦截器,单例
*/
public class BootInterceptor implements HandlerInterceptor {
public final AtomicLong _count = new AtomicLong();// 计数器
// 1
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) {
long begin_nao_time = System.nanoTime();
String realIp = HttpHeadTool.getRealIpAddr(req);
req.setAttribute("p_real_ip", realIp);
req.setAttribute("begin_nao_time", begin_nao_time);
return true;
}
/*3*/
public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object arg2, Exception arg3)
throws Exception {
long begin_nao_time = (Long) req.getAttribute("begin_nao_time");
String real_ip = (String) req.getAttribute("p_real_ip");
long interval = System.nanoTime() - begin_nao_time;
String uri = req.getRequestURI();
StatsManager.inst().statsUri(uri, interval);//统计费时
}
/* 2 */
public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2, ModelAndView arg3)throws Exception {}
}
这个方法得到的结果与阿里巴巴的druid统计的时间略少10%多一点儿
统计结果如图:
今天根据URI费时分析看出访问微信接口获取openid和token,以及头像,昵称这俩接口比较耗时,因此在前端改为获取过信息后放在本地存储,提高了约0.2秒的加载时间