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

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

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

> How to create Proxy Server using jetty8?
> Jetty ProxyServlet with SSL support

这个问题也是一致的:

> Can stand-alone Jetty be used as a reverse proxy (without Apache mod-proxy)

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

关于这个问题……

我已经为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();
    }
}

最佳答案 我找到了用
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,以前我没有使用trasparent代理.
>使用< init-param> of proxyTo使用您希望代理请求的地址.这也意味着上面的(在问题中)ProxyServletExtension.java类是完全没必要的.

此外,值得一提的是有一个前缀< init-param>同样,它可用于在代理代理请求之前删除部分传入请求.

点赞