问题描述:
服务端有两个接口,一个是获取验证码接口,将生成的验证码存储到Shiro的session中,另一个是校验验证码接口,将前端传过来的验证码与session中存储的验证码校验是否正确,但经过测试发现,H5、Android、Postman都能正常获取、校验验证码,只有IOS每次都校验失败。
查找问题:
经过调试发现,IOS校验失败是因为在校验验证码接口中,每次从session中获取的验证码为空。
分析原因:
session中获取的验证码为空,有两种情况,一种是在获取验证码接口中没有存储成功,经过排查,这种原因排除;还有一种情况就是找错了session对象,验证码存储在sessionA对象,然后从sessionB对象中找验证码,当然为空。然后我们来分析第二种情况的原因。
首先,来了解下Shiro的session的原理,Shiro的session其实是基于Http的session实现的,而Http的session的实现原理是:服务器会为每个用户浏览器创建一个会话对象(session对象),然后把session对象的id以cookie的形式返回给客户端,当用户保持当前浏览器的情况下再去访问服务器时,会把session的id传给服务器,服务器根据session的id找到对应的session。
根据session的实现原理,我们知道,如果用户在请求时不带session的id,服务器会重新创建session对象。
经过上述分析,很有可能是因为IOS端每次请求时都没有携带cookie导致的。所以只需要打印下两个接口的request的cookie数据,即可定位问题。