Tomcat 8 Error parsing HTTP request header 解决办法

异常日志信息

网上搜索的答案:

1、服务端提供的是HTTP接口,客户端使用HTTPS(没用过)

2、修改设置Tomcat中config路径下server.xml里的maxHttpHeaderSize值(亲测可用)

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000"  
URIEncoding="UTF-8"   redirectPort="8443" maxHttpHeaderSize="8192"/>

3、更改Tomcat版本(感觉没什么用)

4、前端修改<form>中有个method属性,设置为POST(不建议)

以下为源码位置tomcat-coyote.jar中对应的位置

public AbstractEndpoint.Handler.SocketState process(SocketWrapper<S> socketWrapper) throws IOException {
        RequestInfo rp = this.request.getRequestProcessor();
        rp.setStage(1);

        setSocketWrapper(socketWrapper);
        getInputBuffer().init(socketWrapper, this.endpoint);
        getOutputBuffer().init(socketWrapper, this.endpoint);

        this.keepAlive = true;
        this.comet = false;
        this.openSocket = false;
        this.sendfileInProgress = false;
        this.readComplete = true;
        if (this.endpoint.getUsePolling())
            this.keptAlive = false;
        else {
            this.keptAlive = socketWrapper.isKeptAlive();
        }

        if (disableKeepAlive()) {
            socketWrapper.setKeepAliveLeft(0);
        }

        while ((!getErrorState().isError()) && (this.keepAlive) && (!this.comet) && (!isAsync()) && (this.upgradeToken == null) && (!this.endpoint.isPaused()))
        {
            try
            {
                setRequestLineReadTimeout();

                if ((!getInputBuffer().parseRequestLine(this.keptAlive)) &&
                        (handleIncompleteRequestLineRead()))
                {
                    break;
                }

                if (this.endpoint.isPaused())
                {
                    this.response.setStatus(503);
                    setErrorState(ErrorState.CLOSE_CLEAN, null);
                } else {
                    this.keptAlive = true;

                    this.request.getMimeHeaders().setLimit(this.endpoint.getMaxHeaderCount());
                    this.request.getCookies().setLimit(getMaxCookieCount());

                    if (!getInputBuffer().parseHeaders())
                    {
                        this.openSocket = true;
                        this.readComplete = false;
                        break;
                    }
                    if (!this.disableUploadTimeout)
                        setSocketTimeout(this.connectionUploadTimeout);
                }
            }
            catch (IOException e) {
                if (getLog().isDebugEnabled()) {
                    getLog().debug(sm.getString("http11processor.header.parse"), e);
                }

                setErrorState(ErrorState.CLOSE_NOW, e);
                break;
            } catch (Throwable t) {
                ExceptionUtils.handleThrowable(t);
                UserDataHelper.Mode logMode = this.userDataHelper.getNextMode();
                if (logMode != null) {
                    String message = sm.getString("http11processor.header.parse");

                    switch (1.$SwitchMap$org$apache$tomcat$util$log$UserDataHelper$Mode[logMode.ordinal()]) {
                        case 1:
                            message = message + sm.getString("http11processor.fallToDebug");
                        case 2:
                            getLog().info(message, t);
                            break;
                        case 3:
                            getLog().debug(message, t);
                    }
                }

                this.response.setStatus(400);
                setErrorState(ErrorState.CLOSE_CLEAN, t);
                getAdapter().log(this.request, this.response, 0L);
            }

            if (!getErrorState().isError())
            {
                rp.setStage(2);
                try {
                    prepareRequest();
                } catch (Throwable t) {
                    ExceptionUtils.handleThrowable(t);
                    if (getLog().isDebugEnabled()) {
                        getLog().debug(sm.getString("http11processor.request.prepare"), t);
                    }

                    this.response.setStatus(500);
                    setErrorState(ErrorState.CLOSE_CLEAN, t);
                    getAdapter().log(this.request, this.response, 0L);
                }
            }

            if (this.maxKeepAliveRequests == 1)
                this.keepAlive = false;
            else if ((this.maxKeepAliveRequests > 0) && (socketWrapper.decrementKeepAlive() <= 0))
            {
                this.keepAlive = false;
            }

            if (!getErrorState().isError()) {
                try {
                    rp.setStage(3);
                    getAdapter().service(this.request, this.response);

                    if ((this.keepAlive) && (!getErrorState().isError()) && (!isAsync()) && (statusDropsConnection(this.response.getStatus())))
                    {
                        setErrorState(ErrorState.CLOSE_CLEAN, null);
                    }
                    setCometTimeouts(socketWrapper);
                } catch (InterruptedIOException e) {
                    setErrorState(ErrorState.CLOSE_NOW, e);
                } catch (HeadersTooLargeException e) {
                    getLog().error(sm.getString("http11processor.request.process"), e);

                    if (this.response.isCommitted()) {
                        setErrorState(ErrorState.CLOSE_NOW, e);
                    } else {
                        this.response.reset();
                        this.response.setStatus(500);
                        setErrorState(ErrorState.CLOSE_CLEAN, e);
                        this.response.setHeader("Connection", "close");
                    }
                } catch (Throwable t) {
                    ExceptionUtils.handleThrowable(t);
                    getLog().error(sm.getString("http11processor.request.process"), t);

                    this.response.setStatus(500);
                    setErrorState(ErrorState.CLOSE_CLEAN, t);
                    getAdapter().log(this.request, this.response, 0L);
                }

            }

            rp.setStage(4);

            if ((!isAsync()) && (!this.comet)) {
                if (getErrorState().isError())
                {
                    getInputBuffer().setSwallowInput(false);
                }
                else
                {
                    checkExpectationAndResponseStatus();
                }
                endRequest();
            }

            rp.setStage(5);

            if (getErrorState().isError()) {
                this.response.setStatus(500);
            }

            if (((!isAsync()) && (!this.comet)) || (getErrorState().isError())) {
                this.request.updateCounters();
                if (getErrorState().isIoAllowed()) {
                    getInputBuffer().nextRequest();
                    getOutputBuffer().nextRequest();
                }
            }

            if (!this.disableUploadTimeout) {
                if (this.endpoint.getSoTimeout() > 0)
                    setSocketTimeout(this.endpoint.getSoTimeout());
                else {
                    setSocketTimeout(0);
                }
            }

            rp.setStage(6);

            if (breakKeepAliveLoop(socketWrapper)) {
                break;
            }
        }

        rp.setStage(7);

        if ((getErrorState().isError()) || (this.endpoint.isPaused()))
            return AbstractEndpoint.Handler.SocketState.CLOSED;
        if ((isAsync()) || (this.comet))
            return AbstractEndpoint.Handler.SocketState.LONG;
        if (isUpgrade()) {
            return AbstractEndpoint.Handler.SocketState.UPGRADING;
        }
        if (this.sendfileInProgress) {
            return AbstractEndpoint.Handler.SocketState.SENDFILE;
        }
        if (this.openSocket) {
            if (this.readComplete) {
                return AbstractEndpoint.Handler.SocketState.OPEN;
            }
            return AbstractEndpoint.Handler.SocketState.LONG;
        }

        return AbstractEndpoint.Handler.SocketState.CLOSED;
    }

报错位置为:

if (!getInputBuffer().parseHeaders())//这里
          {
            this.openSocket = true;
            this.readComplete = false;
            break;
          }
          if (!this.disableUploadTimeout)
            setSocketTimeout(this.connectionUploadTimeout);
        }
      }
      catch (IOException e) {
        if (getLog().isDebugEnabled()) {
          getLog().debug(sm.getString("http11processor.header.parse"), e);
        }

        setErrorState(ErrorState.CLOSE_NOW, e);
        break;
      } catch (Throwable t) {
        ExceptionUtils.handleThrowable(t);
        UserDataHelper.Mode logMode = this.userDataHelper.getNextMode();
        if (logMode != null) {
          String message = sm.getString("http11processor.header.parse");

          switch (1.$SwitchMap$org$apache$tomcat$util$log$UserDataHelper$Mode[logMode.ordinal()]) {
          case 1:
            message = message + sm.getString("http11processor.fallToDebug");//处理异常
          case 2:
            getLog().info(message, t);
            break;
          case 3:
            getLog().debug(message, t);
          }
        }

 

引用\[1\]:这个问题通常是由于HTTP请求头部过长导致的。可以通过在Tomcat的server.xml文件中添加maxHttpHeaderSize属性来解决这个问题。例如,在Connector元素中添加maxHttpHeaderSize="8192"。这样可以增加HTTP请求头部的大小限制。\[1\] 引用\[2\]:另外,报错信息中还提到了"Invalid character found in the request target"。这意味着请求目标中存在无效字符。根据RFC 7230和RFC 3986的定义,请求目标中只能包含特定的有效字符。如果请求目标中包含了无效字符,就会导致解析错误。\[2\] 引用\[3\]:还有一种可能的错误是"Invalid character found in method name"。这意味着HTTP方法名中存在无效字符。根据HTTP协议的规定,HTTP方法名必须是有效的标记。如果方法名中包含了无效字符,就会导致解析错误。\[3\] 综上所述,"error parsing http request header"的问题通常是由于HTTP请求头部过长或包含无效字符导致的。可以通过增加maxHttpHeaderSize属性来解决头部过长的问题,并确保请求目标和方法名中只包含有效字符。 #### 引用[.reference_title] - *1* [Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors报错,已...](https://blog.csdn.net/qq_44893880/article/details/105755299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【TomcatError parsing HTTP request header的解决方案](https://blog.csdn.net/qq_33591903/article/details/104915079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值