Как настроить Jetty, чтобы разрешить более крупные формы при использовании с Spark Framework

Как настроить параметры Jetty через инфраструктуру Spark?

Я получаю проблему ниже, когда я отправляю большую форму. Решение для Jetty описано в разделе Формировать слишком большое исключение.

Но Jetty скрыт от меня с помощью Spark Framework, как мне настроить, чтобы решить эту проблему.

    org.eclipse.jetty.http.BadMessageException: 400: Unable to parse form content
        at org.eclipse.jetty.server.Request.getParameters(Request.java:373)
        at org.eclipse.jetty.server.Request.getParameter(Request.java:1016)
        at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:194)
        at spark.Request.queryParams(Request.java:283)
        at spark.http.matching.RequestWrapper.queryParams(RequestWrapper.java:141)
        at com.jthink.songkong.server.callback.ServerEditSongs.startTask(ServerEditSongs.java:45)
        at com.jthink.songkong.server.CmdRemote.lambda$null$62(CmdRemote.java:171)
        at spark.RouteImpl$1.handle(RouteImpl.java:72)
        at spark.http.matching.Routes.execute(Routes.java:61)
        at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:130)
        at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1568)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
        at org.eclipse.jetty.server.Server.handle(Server.java:564)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
        at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
        at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
        at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:59
1)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.IllegalStateException: Form too large: 273433 > 200000
        at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:516)
        at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:454)
        at org.eclipse.jetty.server.Request.getParameters(Request.java:369)
        ... 26 more

person Paul Taylor    schedule 01.03.2018    source источник


Ответы (2)


Немного истории:

  • Я немного поискал в git-репозитории spark и обнаружил, что эта проблема поднималась 3 августа 2015 года, здесь выпуск 314

  • Perwendel (парень, поддерживающий Spark) добавил метку Much wanted 11 октября 2016 г.

  • Затем начал работать над ним 3 ноября 2016 г.

  • Он объединил запрос на слияние PR #813, чтобы открыть возможность для любых настроек Jetty в Spark. встроенный.

Я просмотрел изменения, добавленные в этот PR, и думаю, что вы сможете что-то настроить, внедрив JettyServerFactory, если вы перезапишете метод public Server create(...), вы можете вернуть свой собственный сервер:

public class Main {

  public static void main(String ...args) {
    CustomJettyServerFactory customJettyServerFactory = new CustomJettyServerFactory();
    EmbeddedServers.add(
        EmbeddedServers.Identifiers.JETTY, 
        new EmbeddedJettyFactory(customJettyServerFactory));
  }
}

class CustomJettyServerFactory implements JettyServerFactory {
  @Override
  public Server create(int maxThreads, int minThreads, int threadTimeoutMillis) {
    Server server = new Server();
    server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 1000000);
    return server;
  }

  @Override
  public Server create(ThreadPool threadPool) {
    return null;
  }
}

Пожалуйста, попробуйте и посмотрите, сможете ли вы это сделать, у меня нет никаких настроек, чтобы попробовать это, но я думаю, что это правильный путь для настройки вашего сервера Jetty.

person Bentaye    schedule 08.03.2018
comment
Спасибо, да, это сработало, если вы используете server.setAttribute(org.eclipse.jetty.server.Request.maxFormContentSize, 1000000) (обратите внимание также на дополнительный ноль, по умолчанию 200 000) (хотя теперь возникает другая проблема - java.lang.IllegalStateException : Форма со слишком большим количеством ключей [1001 › 1000] в org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:502) ) - person Paul Taylor; 08.03.2018
comment
FWIW, 2-я проблема устранена путем добавления server.setAttribute(org.eclipse.jetty.server.Request.maxFormKeys, 10000); :) - person Paul Taylor; 08.03.2018
comment
Рад, что это работает! :) Это позволяет действительно глубокую настройку. - person Bentaye; 08.03.2018

Это контролируется атрибутом org.eclipse.jetty.server.Server ..

org.eclipse.jetty.server.Request.maxFormContentSize=<int> для максимального размера формы в байтах

org.eclipse.jetty.server.Request.maxFormKeys=<int> для максимальных ключей формы (здесь существует ограничение для борьбы с DoS-методами коллизии хеш-ключей).

Используйте Server.setAttribute(String name, Object value) вызов.

person Joakim Erdfelt    schedule 02.03.2018
comment
Но есть ли у меня доступ к этим классам Jetty из Spark Framework? - person Paul Taylor; 02.03.2018
comment
По-видимому, это была известная проблема github.com/perwendel/spark/issues/314 и исправлено в Spark Framework 2.6, но я не могу найти инструкции, как это сделать. - person Paul Taylor; 07.03.2018
comment
Я имею ввиду возможность полной настройки Jetty из Spark была добавлена ​​в 2.6 - person Paul Taylor; 07.03.2018
comment
@PaulTaylor, а какая у тебя версия? - person Bentaye; 07.03.2018
comment
@Bentaye У меня 2.7.1, но нет инструкций по настройке Jetty из Spark. - person Paul Taylor; 07.03.2018