2015-12-04 4 views
0

Я использую Jetty версии 9.3.5 для создания ProxyServlet.Jetty 9.3.5 ProxyServlet RewriteTarget Method и! AsyncSupported

Чтобы сделать это, я простирающийся свой класс от

org.eclipse.jetty.proxy.ProxyServlet; 

В отличие от предыдущей версии, я не получаю метод защищенного URI rewriteURI (HttpServletRequest запрос), чтобы переопределить. После прочтения grepcode я вижу что-то вроде Подписок и использовал его:

@Override 
protected String rewriteTarget(HttpServletRequest request) { 
    if (!validateDestination(request.getServerName(), request.getServerPort())) 
     return null; 

    String roleAlias = (String)request.getSession().getAttribute(ATTR_PROXY_ROLE_ALIAS);   

    String uri =request.getRequestURI(); 
    String aliasedURI = getAliasedURI(request.getMethod(), uri, roleAlias); 

    return aliasedURI ; 
} 

Я не знаю, если это правильный метод, чтобы переопределить.

В web.xml У меня есть несколько фильтров и этот сервлет определен. Для сервлета я определил вот так:

<servlet> 
    <servlet-name>Proxy</servlet-name> 
    <servlet-class>com.company.MyProxyServlet</servlet-class> 
    <async-supported>true</async-supported> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Proxy</servlet-name> 
    <url-pattern>/proxy/*</url-pattern> 
</servlet-mapping> 

Но я получаю следующее исключение? Есть идеи? Нужно ли мне делать то же самое для фильтров? тогда как? или что еще не хватает?

java.lang.IllegalStateException: !asyncSupported 
      at org.eclipse.jetty.server.Request.startAsync(Request.java:2224) 
      at org.eclipse.jetty.proxy.ProxyServlet.service(ProxyServlet.java:80) 
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
      at com.company.MyProxyServlet.service(MyProxyServlet.java:66) 
      at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821) 
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1685) 
      at com.netiq.sentinel.elasticsearch.proxy.AuditFilter.doFilter(AuditFilter.java:104) 
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) 
      at com.netiq.sentinel.elasticsearch.proxy.SecurityFilter.doFilter(SecurityFilter.java:160) 
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) 
      at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) 
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
      at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) 
      at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) 
      at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158) 
      at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) 
      at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
      at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090) 
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
      at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) 
      at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) 
      at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) 
      at org.eclipse.jetty.server.Server.handle(Server.java:517) 
      at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) 
      at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) 
      at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) 
      at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
      at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:192) 
      at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) 
      at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
      at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) 
      at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) 
      at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) 
      at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) 
      at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 

Любая помощь?

Примечание: - Я нашел несколько других сообщений, связанных с этой ошибкой, но нигде не использовался метод rewriteTarget. Везде rewriteURI используется, и я не нахожу его с Jetty 9.3.5.

Пожалуйста, помогите.

ответ

1

Я нашел решение.

Мы также должны добавить <async-supported>true</async-supported> для всех фильтров.

+1

Спасибо, что сделал это для меня . .. \t \t true \t

0

Для встраиваемого причала на версии 9.3.7, вот как вы можете зарегистрировать AsyncProxyServlet:

ServletHandler proxyHandler = new ServletHandler(); 
    AsyncProxyServlet servlet = ...your instance of a proxy...; 
    ServletHolder proxyServletHolder = new ServletHolder(servlet); 
    proxyServletHolder.setAsyncSupported(true); 
    proxyServletHolder.setInitParameter("maxThreads", "100"); 
    proxyHandler.addServletWithMapping(proxyServletHolder, "/*"); 

Этого обработчик может быть добавлен к HandlerList и т.д.