【问题标题】:SpringBoot - Error parsing HTTP request header (Oauth2 https endpoints)SpringBoot - 解析 HTTP 请求标头时出错(Oauth2 https 端点)
【发布时间】:2025-11-27 00:40:01
【问题描述】:

当我尝试从 Spring Boot 应用程序访问 OAuth HTTPS 端点时,出现以下错误,但 HTTP 端点工作正常

错误:

2018-07-24 10:25:06.292 [DEBUG][8464][https-jsse-nio-8084-exec-8] o.apache.coyote.http11.Http11Processor:解析 HTTP 请求标头时出错

java.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1250) 在 org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1190) 在 org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:717) 在 org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:366) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:687) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748)

端点

https://localhost:8084/my-auth/oauth/authorize 
https://localhost:8084/my-auth/oauth/token

用于 ssl 的应用 YML 配置:

 port: 8084
    non-http-port: 8083
    context-path: /my-auth
    ssl:
      key-alias: <my cert alais>
      key-password: <my pasword>
      key-store: <my jks path>
      key-store-type: JKS
      enabled: true

安全 java 配置

  @Bean
   public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern(contextPath+"/api/v1/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };

        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }
    private Connector redirectConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(unSecuredPort);
        connector.setSecure(false);
        connector.setRedirectPort(securedPort);
        return connector;
    }

POM 文件

    <?xml version="1.0" encoding="UTF-8"?>
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>my-app-name</artifactId>
        <groupId>my.group.id</groupId>
        <version>my-version</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>my-app-name</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-ldap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.0.15.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

【问题讨论】:

  • 刚刚,贴在这个问题上,谢谢!
  • 我有同样的问题,使用带有 Spring Boot 2 的 OAuth2 的 DB。[DEBUG][10168][https-jsse-nio-8483-exec-4] o.a.tomcat.util.net.SocketWrapperBase: Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@5679dbde:org.apache.tomcat.util.net.SecureNioChannel@7522ebbe:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8483 remote=/0:0:0:0:0:0:0:1:61610]], Read from buffer: [0] 2018-07-24 11:38:26.178 [DEBUG][10168][https-jsse-nio-8483-exec-4] o.apache.coyote.http11.Http11Processor: Error parsing HTTP request header java.io.EOFException: null

标签: spring spring-boot spring-security spring-security-oauth2


【解决方案1】:

这不是错误,这是一条调试消息。

我也中了这个,我相信正确的答案就在这里:

如果日志级别不是 DEBUG,EOF 就会被默默吞下。不幸的是,消息说“意外的 EOF”,因为在这种情况下这是正常的。

我在tomcat nabble site上找到的

这里的调试信息:

   catch (IOException e) {
       if (log.isDebugEnabled()) {
           log.debug(sm.getString("http11processor.header.parse"), e);
       }
       setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
       break;
    }

Http11Processor from Tomcat 8.5

并为此 Tomcat 修复添加了导致它的 EOFException:Non-blocking should throw an EOFException on EOF as well

这是我在spring-cloud github discussion 中对这个“问题”的另一个讨论中发现的

我认为这是完全正常的,因为 OEFException 是我们的同事根据 apache/tomcat@91b7859 添加的。当 ssl 连接到非 ssl 连接器时,INFO 级别的日志记录错误有点激进。

【讨论】:

  • 我可以验证,当我将日志级别更改为 INFO 时,错误消息消失了。谢谢!
  • 非常彻底和明确的答案。也感谢您提供的链接。
【解决方案2】:

我刚刚找到了一个解决方案,问题出在本地主机的自签名证书上。将这些导入到 JDK 的信任库中后,一切正常。

【讨论】:

    【解决方案3】:

    谢谢@bavlin

    要在本地工作 Oauth2 端点,您必须在本地 JRE 信任库中安装证书

    使用以下命令将其添加到本地信任存储中:(在命令提示符下)

    • keytool -keystore cacerts -import -trustcacerts -file“证书的文件路径”

    • 要使其在邮递员中工作 - 在 chrome 浏览器中,将 localhost 证书安装到“受信任的根证书颁发机构”

    【讨论】:

      最近更新 更多