java.lang.IllegalArgumentException:请求标头仅对Spring Boot ReST服务而言太大

时间:2017-12-07 19:41:02

标签: spring rest web-services tomcat servlets

我为你们准备了一个奇怪的人......

2个不同的webserices实现,托管在同一个容器中,与HTTP标头有关的不同行为

我工作的客户很久以前就写了数百个网络服务。它们都像web服务一样暴露出来,它们看起来都像这样。

//Process the HTTP Post request
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 try{
   doGet(request, response);
 }catch(Exception e){
     e.printStackTrace();
 }
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  response.setContentType("text/plain");
  response.setCharacterEncoding("UTF-8");
  String stuff= request.getParameter("stuff");
}

相应的web.xml具有相应的配置,可以根据url-pattern调用该类。很标准。

<servlet-mapping>
 <servlet-name>ResultsServlet</servlet-name>
 <url-pattern>/ResultsServlet</url-pattern>
</servlet-mapping>
<servlet>
 <servlet-name>ResultsServlet</servlet-name>
 <servlet-class>com.ResultsServlet</servlet-class>
</servlet>

注意:此处的“填充”查询参数最多可以包含10k逗号分隔的6位数字。通话始终是POST。

现在,我的任务是构建一个现代框架并将代码迁移到它。因此,我设计了一个简单的Spring Boot应用程序,并使用MVC控制器来公开类似ReST的Web服务。唯一的条件是webservice签名应该看起来像现有的服务。

所以,我继续写下这个。

@RestController
public class ResultsEndpoint {

@RequestMapping(value = "/ResultsServlet", method = RequestMethod.POST, produces = "application/xml")
    public void getProperties(@RequestParam("stuff") String stuff){

}

当查询参数太长时,大约有10k个6位数的逗号分隔数字,我收到此错误。

  

java.lang.IllegalArgumentException:请求标头太大了   org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:515)     在   org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:504)     在   org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:172)     在   org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)     在   org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:637)

旧的和新的Web服务都托管在同一个Tomcat服务器上。旧的查询参数使用旧查询参数时,新的查询参数错误输出。

所以,我谷歌并发现将tomcat中的server.xml中的maxHttpHeaderSize从8k增加到64k将有助于解决问题,而且确实如此。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" maxHttpHeaderSize="65536"/>

他们都在一天结束时使用servlet,一个是原始的,其他更精致,核心实现隐藏了。对吗?我的客户现在想知道为什么旧的web服务有效,但是新的需要改变。由于他们厌恶风险,他们不想在不知道原因的情况下干涉服务器设置。

有人可以帮我弄清楚为什么旧的网络服务适用于大型查询参数但不适用于新的查询参数?

0 个答案:

没有答案