4

我正在研究使用 Jetty 9 作为代理,使用独立的 Jetty,而不是嵌入式的 Jetty。我在很多地方寻求帮助:

其中大部分与嵌入式 Jetty 相关:

这个问题的思路是一样的:

...但唯一的答案是指向包含代理的一些参数的页面的链接,但没有示例或其他有用的提示。

关于这个问题...

我为 Jetty 的 ProxyServlet 创建了一个扩展,它覆盖了rewriteURI()将请求实际更改为不同 URL 的方法。这个自定义代理在运行 Jetty Embedded 时有效,但是当我使用 web.xml 文件和 jetty-maven-plugin 创建要部署的战争时,它不再有效。

当我发出请求时,我可以调试应用程序并查看它是否进入了该rewriteURI()方法,然后它会调用 Jetty 的 ProxyServlet 的service()方法,该方法运行到完成,但没有任何反应。该页面保持空白,最终 ProxyServletonResponseFailure()被调用,并出现 TimeoutException,“Total timeout elapsed”。开发工具显示收到 504 网关超时的请求。

似乎在事物的连接方式上缺少了一些东西,但我不知道它可能是什么。任何帮助将不胜感激。我在下面包含web.xml了自定义代理 ( ProxyServletExtension)。

web.xml

<servlet>
    <servlet-name>proxy</servlet-name>
    <servlet-class>org.example.ProxyServletExtension</servlet-class>
    <init-param>
        <param-name>maxThreads</param-name>
        <param-value>1</param-value>
    </init-param>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>proxy</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

ProxyServletExtension.java

...
import org.eclipse.jetty.proxy.ProxyServlet;
...
public class ProxyServletExtension extends ProxyServlet {
    @Override
    protected URI rewriteURI(HttpServletRequest request) {
        // Forward all requests to another port on this machine
        String uri = "http://localhost:8060";

        // Take the current path and append it to the new url
        String path = request.getRequestURI();
        uri += path;

        // Add query params
        String query = request.getQueryString();
        if (query != null && query.length() > 0) {
            uri += "?" + query;
        }
        return URI.create(uri).normalize();
    }
}
4

1 回答 1

2

我发现使用码头透明代理解决此问题所需的提示总是返回 403 disabled。这个问题与我的问题并不完全相关,但提供的代码片段向我展示了我在<servlet>in 中需要的内容web.xml

更新了 web.xml

<servlet>
    <servlet-name>proxy</servlet-name>
    <servlet-class>org.example.ProxyServletExtension$Transparent</servlet-class>
    <init-param>
        <param-name>maxThreads</param-name>
        <param-value>1</param-value>
    </init-param>
    <init-param>
        <param-name>proxyTo</param-name>
        <param-value>http://localhost:8060</param-value>
    </init-param>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>proxy</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

所需的更改

  1. 设置<servlet-class>ProxyServletExtension$Transparent,以前我没有使用透明代理。
  2. 使用您要将请求代理到的地址<init-param>proxyTo这也意味着ProxyServletExtension.java上面的类(在问题中)是完全没有必要的。

此外,值得一提的是,还有一个prefix <init-param>ass,可用于在代理到代理请求之前删除部分传入请求。

于 2014-07-10T14:21:18.037 回答