问题描述
现在有一个SpringBoot程序使用SpringSecurity安全控件,程序的开发已经接近完成,但是近期发现一个偶尔会发生的异常。当用户登录时有很小的几率失败,正常情况下用户录入登录信息前端会把登录信息提供给后端,由后端通过Http请求SpringSecurity的/oauth/token接口验证登录信息是否正确并获取token。
问题就发生在获取token时,个别情况下登录信息正确但是SpringSecurity没有返回正确的响应信息,导致程序异常。
开发环境
- SpringBoot 2.0.4.RELEASE
- SpringSecurity 2.3.3.RELEASE
- 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
尝试方案与结果
- 内存分配
调整并测试后发现,内存分配越小出现的几率越低,但是分配更多的内存只能减少几率但是依然无法彻底解决,当前最好的情况大约500此请求出现一次错误。
期待
求问这个问题的出现原因!跪求解决方案!!!
万分感谢!!!
看错误信息,cn.hutool.http.HttpConnection.responseCode(HttpConnection.java:470),如果有代码显式的调用这个api,再debug走走呗,看看是哪里的问题