与Spark Framework一起使用时,如何配置Jetty以允许更大的表单

时间:2018-03-01 16:17:16

标签: java jetty spark-framework

如何通过Spark framework配置Jetty选项?

我在提交大型表格时遇到问题。 Jetty的解决方案记录在Form too Large Exception

但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

2 个答案:

答案 0 :(得分:3)

一点历史:

  • 我查了一下关于spark的git repo,发现这个问题是在2015年8月3日提出的,issue 314

  • Perwendel(维持Spark的人)于2016年10月11日添加了Much wanted标签

  • 然后于2016年11月3日开始研究

  • 他合并了Pull Request PR #813,为Spark嵌入式中的任何Jetty设置开辟了可能性。

我查看了此PR中添加的修改,我认为您可以通过实现JettyServerFactory来配置某些内容,如果覆盖public Server create(...)方法,则可以返回自定义服务器:< / p>

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服务器的正确途径。

答案 1 :(得分:1)

这是通过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)来电。