这次说一说Disgest Authentication遇到的坑
公司有个项目客户端访问流程需要经过Disgest Authentication,由于公司之前部署该项目在Tomcat8.0;于是本人满怀信心的将tomcat升级(->Tomcat8.5->Tomcat9.0), 结果发现客户端第一次访问接口401后,第二次访问还是401。
按之前正常流程应该是第一次访问接口返回401,第二次客户提交在摘要认证信息后会返回200。可是现在Tomcat升级后结果却是意料之外,找客户端人员排查问题说暂时没时间,我这人属于急性子,所以只能靠自身解决问题,于是开始抓包分析(抓包工具:wireshark)
1、Tomcat8.0下第一次访问
2、Tomcat9.0下第一次访问返回
3、比较两次数据报文后发现响应消息第一行Header有差异
Tomcat8.0:HTTP/1.1 401 Unauthorized \r\n
Tomcat9.0:HTTP/1.1 401 \r\n
这里提一下这个组成的意义:HTTP-Version Status-Code Reason-Phrase \r\n
HTTP -Version:表示支持的HTTP版本
Status-Code:三个数字的结果代码
Reason-Phrase:描述
4、有了这些信息本人判断客户端应该是通过描述字段去判断是否是401,Unauthorized;Tomcat9.0由于response默认缺少这个字段从而导致客户端不能识别这次response是要经过摘要认证。于是就有了下面解决问题的代码:
response.setHeader("HTTP-Version", "HTTP/1.1");
response.setHeader("Status-Code", "401");
response.setHeader("Reason-Phrase","Unauthorized");
总结:遇到问题先理性分析,理解问题的根源很重要。