我正在开发一个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);
}
}
答案 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);
}
}