我正在研究使用 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();
}
}