【问题标题】:ContinuationListener does not seem to work in a filter chain terminated by Jetty's ProxyServlet, after upgrading Jetty from 8.x to 9.x在将 Jetty 从 8.x 升级到 9.x 后,ContinuationListener 似乎无法在由 Jetty 的 ProxyServlet 终止的过滤器链中工作
【发布时间】:2017-02-21 18:13:04
【问题描述】:

环境:

  • 在我的环境中,Kibana 4.5.2 在通过扩展 Jetty 的“ProxyServlet”类创建的“反向代理 servlet”后面运行。
  • 这样做是为了可以使用 URL https://Jetty_Server_IP:8443/visual-analytics/proxy/... 访问 Kibana Web 界面。对此 URL 的请求被 Jetty 服务器中运行的反向代理拦截并重定向到 https://localhost:5601/... 即,到与 Jetty 服务器在同一台机器上运行的 Kibana 服务器。
  • Kibana 服务器然后处理 Jetty 服务器转发的请求并将响应返回给 Web 浏览器。
  • 注意: Jetty 在我的应用程序中以“嵌入式模式”运行。

问题:

“反向代理 servlet”映射到 URL“/visual-analytics/proxy/*”。

还有另一个“过滤器”映射到 URL“/visual-analytics/proxy/elasticsearch/.kibana/search/*”,其中正在使用“ContinuationListener”,如以下代码 sn-p 所示:

    ContinuationSupport.getContinuation(myRequestWrapper).addContinuationListener(new ContinuationListener() {

                        @Override
                        public void onTimeout(Continuation continuation) {
                            logger.log(Level.WARNING, "Request timeout...");
                        }

                        @Override
                        public void onComplete(Continuation continuation) {

                            HttpServletResponse httpResponse = (HttpServletResponse)continuation.getServletResponse();
                            if (httpResponse.getStatus() == HttpServletResponse.SC_OK || httpResponse.getStatus() == HttpServletResponse.SC_CREATED ) {                                                                       
                                    //some business logic
                            }

                        }
                    });

    chain.doFilter(myRequestWrapper, response);

上述 ContinuationListener 在 Jetty 版本 8.1.15.v20140411 上运行良好,并且正在调用侦听器的 onComplete() 方法。但是在将 Jetty 版本升级到 9.3.14.v20161028 后,ContinuationListener 不再工作,即,监听器的 onComplete() 方法和 onTimeout() 方法都没有被调用。

任何关于可能出错的地方或如何进一步调试此问题的指针将不胜感激。期待任何回应...

【问题讨论】:

    标签: java reverse-proxy servlet-filters embedded-jetty jetty-9


    【解决方案1】:

    仅供参考,我将这个问题修复如下:

    1. 将早期使用 Jetty 的“ContinuationListener”的方法替换为 Servlet 3.0 的“AsyncListener”,因为 Jetty 的“ContinuationListener”在升级到 Jetty 9.3.14.v20161028 后似乎不起作用。这可能是 Jetty 错误。
    2. 侦听器相关的代码段位于过滤器的“chain.doFilter()”调用之前。我将此代码段移动到过滤器的“chain.doFilter()”调用之后的位置,以便可以检索在 Jetty ProxyServlet 的 service() 方法中“已创建”的 AsyncContext。然后我可以将 AsyncListener 添加到检索到的 AsyncContext。
    3. 我没有在我的过滤器中使用“request.startAsync()”调用,而是使用“request.getAsyncContext()”,这样我就不会启动一个导致 IllegalStateException 的新 AsyncContext,而只是检索 AsyncContext已经在 J​​etty 的 ProxyServlet 中创建。

    所以更新后的代码段是这样的:

            chain.doFilter(myRequestWrapper, response);
    
            AsyncContext asyncContext = myRequestWrapper.getAsyncContext();
            asyncContext.addListener(new AsyncListener() {
    
                @Override
                public void onTimeout(AsyncEvent event) throws IOException 
                {
                            logger.log(Level.WARNING, "Async timeout...");
                }
    
                @Override
                public void onStartAsync(AsyncEvent event) throws IOException 
                {
                            logger.log(Level.INFO, "Async start...");
                }
    
                @Override
                public void onError(AsyncEvent event) throws IOException 
                {
                            logger.log(Level.SEVERE, "Async error...");
                }
    
                @Override
                public void onComplete(AsyncEvent event) throws IOException 
                {
                        HttpServletResponse httpResponse = (HttpServletResponse) event.getAsyncContext().getResponse();
                        if (httpResponse.getStatus() == HttpServletResponse.SC_OK || httpResponse.getStatus() == HttpServletResponse.SC_CREATED ) {
                                    //some business logic
                        }
                }
            }, myRequestWrapper, httpServletResponse);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2012-04-08
      相关资源
      最近更新 更多