使用Jetty启动WEB,请求报错java.lang.IllegalStateException: Form too large: 206150 > 200000

本文介绍了一种常见的Java Web应用程序异常“FormtooLarge”,详细解释了如何通过调整Jetty服务器中ServletContextHandler的最大表单内容大小来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.IllegalStateException: Form too large: 206150 > 200000
	at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:353)
	at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:291)
	at org.eclipse.jetty.server.Request.extractParameters(Request.java:243)
	at org.eclipse.jetty.server.Request.getParameter(Request.java:867)
	at com.kakasure.interceptor.LoginHandlerInterceptor.preHandle(LoginHandlerInterceptor.java:46)
	at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:954)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:781)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1126)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1060)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
	at org.eclipse.jetty.server.Server.handle(Server.java:498)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:265)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:243)
	at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:610)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:539)
	at java.lang.Thread.run(Thread.java:745)

该错误只需在启动的代码里设置maxFormContentSize就可以,启动里面有句代码:

ServletContextHandler context = new WebAppContext("src/main/webapp", "/");

对context设置该值既可以:

context.setMaxFormContentSize(900000);

测试不报错了!!!



### 解决方案 在 Java WebSocket 中出现 `java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available` 错误时,通常是因为配置或环境问题导致的。以下是几种常见的解决方案: 1. **注释掉 WebSocket 相关的注解** 一种简单但不推荐的方式是直接注释掉与 WebSocket 配置相关的注解,例如 `@EnableWebSocket` 和 `@Configuration`[^1]。这种方式虽然可以避免错误,但会禁用 WebSocket 功能。 2. **移除 ServerEndpointExporter 的定义** 如果不需要使用 Spring 的 `ServerEndpointExporter`,可以直接从配置类中移除其 Bean 定义。具体操作为注释掉或删除以下代码片段[^2]: ```java @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } ``` 3. **使用环境激活策略** 更优雅的解决方案是通过 Spring 的 `@Profile` 注解限制 `ServerEndpointExporter` 的加载范围。例如,仅在开发环境(`dev`)或测试环境(`test`)中加载 WebSocket 配置,在生产环境中禁用它。示例代码如下[^3]: ```java @Configuration //@EnableWebSocket public class WebSocketConfig { @Bean @Profile({"dev", "test"}) public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } ``` 4. **检查嵌入式 Tomcat 的版本** 确保使用的 Spring Boot 版本和嵌入式 Tomcat 版本支持 WebSocket 功能。如果 Tomcat 版本过低,可能会导致 `ServerContainer` 不可用的问题。可以通过升级 Spring Boot 或显式指定 Tomcat 版本来解决此问题。 5. **避免与其他 WebSocket 实现冲突** 如果项目中同时引入了多个 WebSocket 实现(例如 Jetty 和 Tomcat),可能会导致冲突。建议检查项目的依赖树,确保没有重复或冲突的依赖项。 6. **手动注册 WebSocket Endpoint** 如果仍然无法解决问题,可以尝试手动注册 WebSocket Endpoint,而不是依赖 `ServerEndpointExporter` 自动扫描。示例代码如下: ```java @Configuration public class WebSocketConfig { @Bean public ServletListenerRegistrationBean<TomcatWebSocketEventListener> tomcatWebSocketEventListener() { return new ServletListenerRegistrationBean<>(new TomcatWebSocketEventListener()); } private static class TomcatWebSocketEventListener extends ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent event) { if ("javax.websocket.server.ServerContainer".equals(event.getName())) { ServerContainer container = (ServerContainer) event.getValue(); try { container.addEndpoint(MyWebSocketEndpoint.class); } catch (DeploymentException e) { throw new RuntimeException(e); } } } } } ``` ### 注意事项 - 在生产环境中,尽量避免启用 WebSocket 功能,除非确实需要。 - 如果使用的是第三方库(如 Undertow 或 Jetty),请确保其配置与 Spring Boot 的默认配置兼容。 - 如果以上方法均无效,可以尝试通过日志定位问题的具体原因,并根据实际情况调整配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值