我正在调查使用Jetty 9作为代理,使用独立的Jetty,而不是嵌入式Jetty。我在很多地方寻求帮助:
其中大部分都与嵌入式Jetty有关:
这个问题也是一样的:
...但唯一的答案是指向代表某些参数的页面的链接,但没有示例或其他有用的提示。
关于问题......
我已经为Jetty的ProxyServlet创建了一个扩展,它会覆盖rewriteURI()
方法以实际将请求更改为其他URL。这个自定义代理在运行Jetty嵌入时工作,但是当我使用web.xml文件和jetty-maven-plugin来创建要部署的战争时,它不再有效。
当我发出请求时,我可以调试应用程序并看到它进入rewriteURI()
方法,然后调用Jetty的ProxyServlet的service()
方法,该方法运行完成,但没有任何反应。该页面保持空白,最终使用TimeoutException调用ProxyServlet的onResponseFailure()
,"已超过总超时数"。开发工具显示请求接收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();
}
}
答案 0 :(得分:2)
我找到了jetty transparent proxy always returns 403 forbidden解决此问题的提示。这个问题与我的问题并不完全相关,但所提供的代码段向我展示了<servlet>
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>
所需的更改
<servlet-class>
设置为ProxyServletExtension$Transparent
,之前我没有使用过透明代理。<init-param>
proxyTo
ProxyServletExtension.java
使用您要代理请求的地址。这也意味着上面的prefix
类(在问题中)是完全没必要的。此外,值得一提的是,还有<init-param>
{{1}},可用于在代理代理请求之前删除部分传入请求。