如何使用异步Servlet修改代理响应? [英] How do I modify proxy responses using asynchronous servlets?

查看:9
本文介绍了如何使用异步Servlet修改代理响应?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现一个异步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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆