java - Spring Boot 休息 NioSocketWrapper.getSslSupport NullPointerException

标签 java spring mongodb rest https

问题

我们面临着一个特定客户端从美国登录到 Digitalocean 位于纽约数据中心的服务的问题。他报告了一个通用的 http 连接问题。来自欧洲的其他客户没有问题。

我还可以确认客户端无法与授权服务创建 session 。

架构

我们有一个网络应用程序、一个第三方 SSO 提供商、一个授权服务和一个资源服务。服务使用 HTTPS,网络应用程序不使用。

这些服务是带有 spring-boot-starter-securityspring-boot-starter-web 的 Spring Boot (1.4.1.RELEASE) REST Controller >unirest-java (1.4.9),由 MongoDB 支持。

日志

资源服务

2016-10-29 15:37:57.282 ERROR 5 --- [nio-8444-exec-4] o.a.coyote.http11.Http11NioProtocol      : Error reading request, ignored

java.lang.NullPointerException: null
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.getSslSupport(NioEndpoint.java:1329) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:792) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_11]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_11]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_11]

认证服务

2016-10-29 15:37:57.279 ERROR 7 --- [nio-8443-exec-6] o.a.coyote.http11.Http11NioProtocol      : Error reading request, ignored

java.lang.NullPointerException: null
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.getSslSupport(NioEndpoint.java:1329) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:792) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_11]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_11]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_11]

问题

我不知道为什么会弹出这个异常并且只针对这个特定的客户端。你能帮助我吗?我会提供更多信息。

最佳答案

基于 this topic ,这似乎是 Http11NioProtocol 中的一个错误。作为解决方法,他们建议使用 Http2NioProcol。

这里是一个如何在spring boot中配置Htpp2NioProtocol的例子.

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.addAdditionalTomcatConnectors(createSslConnector());
    return tomcat;
}

private Connector createSslConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http2NioProtocol");
    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
    try {
        File keystore = new ClassPathResource("keystore").getFile();
        File truststore = new ClassPathResource("keystore").getFile();
        connector.setScheme("https");
        connector.setSecure(true);
        connector.setPort(8443);
        protocol.setSSLEnabled(true);
        protocol.setKeystoreFile(keystore.getAbsolutePath());
        protocol.setKeystorePass("changeit");
        protocol.setTruststoreFile(truststore.getAbsolutePath());
        protocol.setTruststorePass("changeit");
        protocol.setKeyAlias("apitester");
        return connector;
    }
    catch (IOException ex) {
        throw new IllegalStateException("can't access keystore: [" + "keystore"
                + "] or truststore: [" + "keystore" + "]", ex);
    }
}

ps:我不认为这会真正解决问题,但会给你一个更好的错误信息而不是 NPE。我还建议您获取无法连接到您的服务的用户的浏览器和操作系统信息。可能他的电脑无法解析你服务器证书的证书链。

关于java - Spring Boot 休息 NioSocketWrapper.getSslSupport NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40321174/

相关文章:

Spring Config Server "="符号加密问题

mongodb - 导出集合并用另一个集合中的字段替换字段(聚合?)

sqlite - 将数据库从 SQLite 导出到 MongoDB

java - JPA 2 : How many methods are allowed in one entity with @Prepersist annotation?

java - 返回 ArrayList 的 SOAP 响应

java - 如何同时运行多个线程进行自动化 Selenium 测试?

java - Spring Data 配置 - 找不到 hibernate.properties

java - 如何使用exoplayer检测视频是否包含声音

java - Spring Data JPA - 尝试将 IN 子句与 UPDATE 查询一起使用时出现 SQL 语法异常

mongodb - 将 scala/spark 信息写入 MongoDB