如何使用异步Servlet修改代理响应? [英] How do I modify proxy responses using asynchronous servlets?
问题描述
我正在尝试实现一个异步Servlet,它将接收终端用户的请求,将其传递到后端服务器并获取响应。
到目前为止,这听起来像是Jetty的ProxyServlet
的标准应用程序。
现在,问题是我的后端将使用Include语句进行响应(有点像Server-Side-Includes),我需要对这些语句进行解析、查询后端并插入到最终用户的响应流中的适当位置。
您将如何实施这一点?我对在onResponseContent
回调期间解析和触发中间请求特别感兴趣,我知道回调可能包含也可能不包含完整的响应(因此可能只包含INCLUDE语句的一部分)。
为了说明,以下是我目前拥有的内容:
@WebServlet(name = "MyServlet",
urlPatterns = {"/my/outbounduri/*"},
initParams = {
@WebInitParam(name = "proxyTo", value = "/servlet/backend")
}
)
public class MyHandler extends ProxyServlet {
@Override
protected void customizeProxyRequest(HttpServletRequest srequest,
HttpServletResponse sresponse ) {
// add custom headers for the backend
}
@Override
protected void onResponseContent(HttpServletRequest request,
HttpServletResponse response, Response proxyResponse,
byte[] buffer, int offset, int length, Callback callback) {
try {
// instead of passing the content on, we need to catch
// include statements
// response.getOutputStream().write(buffer, offset, length);
callback.succeeded();
} catch (Throwable x) {
callback.failed(x);
}
}
@Override
protected void onResponseSuccess(HttpServletRequest request,
HttpServletResponse response, Response proxyResponse) {
AsyncContext asyncContext = request.getAsyncContext();
asyncContext.complete();
}
}
Jetty
如果您在代理内容的过程中修改该内容,请使用推荐答案9.2.8.v20150217
及其新的org.eclipse.jetty.proxy.AsyncMiddleManServlet
。
注意:这是一个全新的功能,在实现中肯定会有一些缺点。
这是专门的AsyncProxyServlet
,旨在简化修改来自客户端的请求内容和/或来自远程服务器的响应内容的复杂性。(当代理的两端具有不同的传输编码时,这尤其复杂)
在您的用例中,从覆盖AsyncMiddleManServlet.newServerResponseContentTransformer(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse)
开始,并让它返回您的设计的ContentTransformer
的一个新实例,该实例执行此转换所需的逻辑。
实现您自己的ContentTransformer
,它在.transform(ByteBuffer input, boolean finished, List<ByteBuffer> output)
input
,一旦你有东西要写,做一个output.add(modified)
。请注意finished
标志,因为它让您知道何时接收到最后一位输入内容。
另外,如果您需要控制从客户端请求端到远程服务器端的URL差异,请重写String rewriteTarget(HttpServletRequest clientRequest)
方法,读取客户端请求信息并返回修改后的远程URL字符串。
这篇关于如何使用异步Servlet修改代理响应?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!