【问题标题】:Using Jetty's proxy in standalone Jetty application在独立的 Jetty 应用程序中使用 Jetty 的代理
【发布时间】:2014-07-09 21:05:11
【问题描述】:

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

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

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

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

关于问题...

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

当我发出请求时,我可以调试应用程序并看到它进入 rewriteURI() 方法,然后它调用 Jetty 的 ProxyServlet 的 service() 方法,该方法运行完成,但没有任何反应。该页面保持空白,最终 ProxyServlet 的 onResponseFailure() 被调用,并带有 TimeoutException,“总超时已过”。开发工具显示收到 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();
    }
}

【问题讨论】:

    标签: proxy jetty maven-jetty-plugin jetty-9


    【解决方案1】:

    我找到了使用jetty transparent proxy always returns 403 forbidden 解决此问题所需的提示。这个问题与我的问题并不完全相关,但 sn-p 提供的代码向我展示了我在 web.xml 中的 &lt;servlet&gt; 中需要的内容。

    更新的 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. &lt;servlet-class&gt; 设置为ProxyServletExtension$Transparent,之前我没有使用透明代理。
    2. 使用proxyTo 中的&lt;init-param&gt;,使用您希望将请求代理到的地址。这也意味着上面的ProxyServletExtension.java 类(在问题中)是完全没有必要的。

    另外,值得一提的是,还有一个prefix &lt;init-param&gt;,它可以用来在代理到代理请求之前删除部分传入请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多