SpringSecurity获取token时偶尔出现Invalid Http response

小胖
  • 70

问题描述

现在有一个SpringBoot程序使用SpringSecurity安全控件,程序的开发已经接近完成,但是近期发现一个偶尔会发生的异常。当用户登录时有很小的几率失败,正常情况下用户录入登录信息前端会把登录信息提供给后端,由后端通过Http请求SpringSecurity的/oauth/token接口验证登录信息是否正确并获取token。
问题就发生在获取token时,个别情况下登录信息正确但是SpringSecurity没有返回正确的响应信息,导致程序异常。

开发环境

  1. SpringBoot 2.0.4.RELEASE
  2. SpringSecurity 2.3.3.RELEASE
  3. hutool 5.7.5

后端代码

// 请求地址
String url = "http://127.0.0.1:8080/***/oauth/token";
// 请求参数
Map<String, Object> paramMap;// 省略具体参数
String res = HttpUtil.post(url, paramMap);
JSON.parseObject(res);

错误信息

Caused by: java.io.IOException: Invalid Http response
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection$10.run(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection$10.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at cn.hutool.http.HttpConnection.getInputStream(HttpConnection.java:417)
        at cn.hutool.http.HttpInputStream.init(HttpInputStream.java:81)
        ... 119 more
Caused by: java.io.IOException: Invalid Http response
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at java.net.HttpURLConnection.getResponseCode(Unknown Source)
        at cn.hutool.http.HttpConnection.responseCode(HttpConnection.java:470)
        at cn.hutool.http.HttpResponse.init(HttpResponse.java:420)
        ... 117 more

尝试方案与结果

  1. 内存分配
    调整并测试后发现,内存分配越小出现的几率越低,但是分配更多的内存只能减少几率但是依然无法彻底解决,当前最好的情况大约500此请求出现一次错误。

期待

求问这个问题的出现原因!跪求解决方案!!!
万分感谢!!!

回复
阅读 1.3k
3 个回答

看错误信息,cn.hutool.http.HttpConnection.responseCode(HttpConnection.java:470),如果有代码显式的调用这个api,再debug走走呗,看看是哪里的问题

服务端的代码怎么写的?谷歌了一下貌似就你遇到了这个问题

返回的状态码为-1,被认定为不是一个有效的http请求,有说链接中断,设置keepAlive的,有说没有上网许可的,有说参数传错了的,五花八门。顺便一说,spring securtiy 是集成了oauth2的,根本不需要自己请求,都有自己的一套流程,你配置小url就行了。框架自己请求并放入上下文中。自己请求很多情况都是画蛇添足,后续工作跟本自己就处理不好。

宣传栏