如何在@Around建议中访问HttpServletResponse对象

时间:2015-03-20 18:08:10

标签: spring servlets model-view-controller aop aspectj

我想在日志记录方面捕获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,因此我可以输出我的返回码。我可以肯定地在控制器中处理它,但是,有兴趣将这一切保持在这方面。

1 个答案:

答案 0 :(得分:1)

从我可以看到,返回控制器时尚未形成响应。在形成响应之前,这将进一步移交给spring的视图解析器api。 如果您的目的只是记录appserver服务请求所花费的时间,您可能需要查看“javax.servlet.Filter”实现。它使您可以处理所有请求/响应api,它可能是第一个也是最后一个要执行的操作,具体取决于您在web.xml中配置过滤器链的方式。 此外,控制器周围的Aspect将不包括执行jsp所花费的时间。在控制器返回后,某些标签处理程序可能会为您的处理增加相当长的时间。