Sparkjava Error: org.eclipse.jetty.http.HttpParser - Header is too large >8192

Sparkjava Error: org.eclipse.jetty.http.HttpParser - Header is too large >8192

我们正在开发基于sparkjava框架的内部web组件,使用HTTP GET而不是POST为了方便。

当请求URL包含大数据(超过8K)时返回错误如下: org.eclipse.jetty.http.HttpParser - Header is too large >8192.

如何解决?

Sparkjava 在嵌入式 Jetty 服务器上运行,但大多数 Jetty 配置在 sparkjava 框架中默认是硬编码的。

一种解决方案是自定义 EmbeddedServerFactory:

    static Server server = null;

    private static void startup() {
        EmbeddedServers.add(EmbeddedServers.Identifiers.JETTY, createEmbeddedServerFactory());

        awaitInitialization();

        Stream.of(server.getConnectors()).map(Connector::getConnectionFactories).flatMap(Collection::stream)
                        .filter(t -> t.getClass().isAssignableFrom(HttpConnectionFactory.class))
                        .map(t -> ((HttpConnectionFactory) t).getHttpConfiguration()).forEach(t -> {
                            t.setRequestHeaderSize(512 * 1024 * 1024);
                            t.setSendServerVersion(false);
                            t.setSendDateHeader(false);
                        });
    }

    private static EmbeddedServerFactory createEmbeddedServerFactory() {
        return new EmbeddedJettyFactory(new JettyServerFactory() {
            @Override
            public Server create(int maxThreads, int minThreads, int threadTimeoutMillis) {
                return create(maxThreads <= 0 ? null
                                : new QueuedThreadPool(maxThreads, minThreads, threadTimeoutMillis));
            }

            @Override
            public Server create(ThreadPool threadPool) {
                return server = new Server(threadPool);
            }

        });
    }