我想在日志记录方面捕获httpResponse对象,以便我可以集中记录http返回代码以用于我的控制器方法。例如类似的东西:
@Around("execution(* ..*Controller.*(..))")
public Object handleLogging(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
long startTime = System.currentTimeMillis();
// HttpServletRequest works no problem
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
logger.info("this was the request url", request.getRequestURI());
// proceed with method
try {
retVal = pjp.proceed();
}
finally{
// stop stopwatch
long endTime = System.currentTimeMillis();
long duration = endTime-startTime;
// how do I get the response?
// this doesn't seem to work, response is null..
ServletWebRequest servletWebRequest=new ServletWebRequest(request);
HttpServletResponse response=servletWebRequest.getResponse();
logger.info(appendEntries(securityAuditParameters),
"Method={} executionSuccess={} executionTime={}", pjp.getSignature(), response.getStatus(), duration);
}
return retVal;
}
我无法弄清楚如何获取HttpServletResponse,因此我可以输出我的返回码。我可以肯定地在控制器中处理它,但是,有兴趣将这一切保持在这方面。
答案 0 :(得分:1)
从我可以看到,返回控制器时尚未形成响应。在形成响应之前,这将进一步移交给spring的视图解析器api。
如果您的目的只是记录appserver服务请求所花费的时间,您可能需要查看“javax.servlet.Filter
”实现。它使您可以处理所有请求/响应api,它可能是第一个也是最后一个要执行的操作,具体取决于您在web.xml中配置过滤器链的方式。
此外,控制器周围的Aspect将不包括执行jsp所花费的时间。在控制器返回后,某些标签处理程序可能会为您的处理增加相当长的时间。