首先说下项目背景:
leap-id做登录认证的SSO(其他团队做的),metadata元数据系统(这也是我在做开发的项目)
在metadata登录leap-id,获取lpt认证,传到loginCallback方法,存到cookies里,跳转到首页,这样就登录成功。
遇到问题:
我在本地改好bug,发布到linux测试环境(在本地win环境调试是没有问题的),始终出现首页循环登录的问题,然而找不到任何日志,(这是发生在leap-id之后,他们把以前的ip换成了域名),chrome调试发现所有发出的请求也都是正常的,我很认真的比对正常登录的所有请求和出现循环登录问题的所有请求,发现是在执行loginCallback执行之后又调到登录页面去登录了,可以我明明已经登录了啊,后面打印出日志发现是没有得到登录的userinfo。loginCallback的逻辑是登录成功后就跳转到首页,失败就到登录页面。继续调试发现是问题的是这几行代码:
try {
byte[] e = LeapidUtils.doGetHttpRequest(url);
if(e.length > 0) {
bis = new ObjectInputStream(new ByteArrayInputStream(e));
IdInfo idInfo = (IdInfo)bis.readObject();
if(idInfo != null) {
request.setAttribute("sso_idinfo", idInfo);
}
}
} catch (Exception var15) {
System.err.println("access url exception:" + url + ", leapidToken=" + leapidToken);
var15.printStackTrace(System.err);
} finally {
CloseableUtils.close(new Closeable[]{bis});
}
这里doGetHttpRequest是RPC调用登录成功后在leap-id系统取得用户的信息。但是leap-id那边升级域名之后,我在win配置了host,当时确实不知道内部会有这样的调用,以为不需要再linux配置host,就在这里因为没配置host的问题,我花了一整天,和写这个项目的哥们儿一起研究,最后才找到问题。
最重要的是这句:
System.err.println("access url exception:" + url + ", leapidToken=" + leapidToken);
我们项目使用log4j打印日志,他用System.err.println去打印这个异常,所以这个日志是不会被打印出来,如果是用log.info来打印的话,有这个日志信息,就回很快发现这个问题了。我们在面对这种很诡异的问题的时候,没有任何日志信息,只能一点一点排除,最开始以为是那边升级出了问题,或是linux String和win的长度不一样,,,我做了很多假设,花了不少时间去一点一点排除,如果能打印出了日志,问题会很快得到解决。
最后总结:RPC调用第三方接口的时候,一定要把日志打印出来。在任何时候请不要用System.err.println这样的语句来打印,这样会让你在fix测试,或者是线上bug变得异常艰难。