在独立的 Jetty 应用程序中使用 Jetty 的代理



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

大多数都与嵌入式Jetty相关:

  • 如何使用jety8创建代理服务器?
  • Jetty ProxyServlet支持SSL

这个问题也是一样的:

  • 独立的Jetty可以用作反向代理吗(没有Apache mode -proxy)

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

关于这个问题…

我已经为Jetty的ProxyServlet创建了一个扩展,它覆盖了rewriteURI()方法以实际将请求更改为不同的URL。这个自定义代理在运行嵌入Jetty时可以工作,但是当我使用web.xml文件和Jetty -maven-plugin创建一个war来部署时,它就不再工作了。

当我发出请求时,我可以调试应用程序并看到它进入rewriteURI()方法,然后它调用Jetty的ProxyServlet的service()方法,该方法运行到完成,但随后什么也没有发生。页面保持空白,最终ProxyServlet的onResponseFailure()调用TimeoutException,"总超时时间"。Dev tools显示收到504 Gateway Timeout的请求。

似乎在事物之间的联系中缺少了什么,但我不知道是什么。任何帮助都将非常感激。我在下面包含了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();
    }
}

我找到了解决这个问题所需的提示:透明代理总是返回403 forbidden。这个问题并不完全符合我的问题,但是提供的代码片段向我展示了web.xml<servlet>中需要的内容。

更新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>
<<p> 要求变化/strong>
  1. 设置<servlet-class>ProxyServletExtension$Transparent,以前我没有使用透明代理。
  2. 使用proxyTo<init-param>,使用您想代理请求的地址。这也意味着上面的ProxyServletExtension.java类(在问题中)是完全不必要的。

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

最新更新