用于记录标注的AOP解决方案 - 传出的http请求和响应

时间:2016-02-15 18:08:17

标签: java spring logging filter

我正在开发一个spring启动应用程序并实现一个javax.servlet.Filter(使用HttpServletResponseWrapper和HttpServletRequestWrapper)来拦截传入的http请求并记录它们。虽然这适用于来电,但我不确定如何拦截拨出电话(标注)。我不确定是否碰到了一个SO页面,为非SOAP客户端解释了这一点。

我尝试扩展HandlerInterceptorAdapter类并覆盖preHandle()和postHandle()方法,但这些方法似乎拦截了传入的请求。我对拨打电话很感兴趣。

拦截和记录客户端/传出的http请求和响应或标注的远程解决方案是什么?

标注使用以下助手类:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;

@Service
public class CalloutService {
@Autowired
protected HttpClient httpClient;

public CalloutService() {
}

private MessageResponse sendRequest(HttpRequestBase request, Map<String, String> httpHeaders) throws IOException {
    addHttpHeaders(request, getDefaultHeaders());
    addHttpHeaders(request, httpHeaders);
    HttpResponse response = httpClient.execute(request);
    HttpEntity entity = response.getEntity();
    String responseBody = IOUtils.toString(entity.getContent(), "UTF-8");
    StatusLine statusLine = response.getStatusLine();
    return new MessageResponse(statusLine.getStatusCode(), statusLine.getReasonPhrase(), responseBody);
  }
}

1 个答案:

答案 0 :(得分:2)

在Spring应用程序中,您通常使用RestTemplate这个请求进行请求,可以进行配置,并在需要时自动连接它。因此,在配置一个时,可以设置拨出呼叫的拦截器。在这个blog上有一个关于如何做的例子。希望这会有所帮助,但这基本上是如何做到的。

配置RestTemaplte的另一个更好的选择是创建自己的。{1}}。你可以这样做:

public class RestTemplate extends org.springframework.web.client.RestTemplate implements InitializingBean {
    @Override
    public void afterPropertiesSet() {
        if(this.getInterceptors() == null){
            this.setInterceptors(new LinkedList<>());
        }
        this.getInterceptors().add(new YourInterceptor());
    }
}

private static class YourInterceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        //do what you need to do here with the request
        return execution.execute(request, body);
    }
}