sessionId的生成和利用
浏览器在第一次请求服务器时,服务器响应请求的同时会生成一个sessionId返回给浏览器,这个sessionId会保存在浏览器的cookie中,由于浏览器测试不太方便,使用POSTMAN代替。浏览器端如下:
服务器端如下:
很明显能够看出来,sessionId架起了客户端与服务器的沟通桥梁,使得辨别请求用户身份成为了可能。客户端在请求后会保存sessionId到cookie中,而服务器端也可以在sessionId指向的session中保存一些用户信息。不同用户每创建一个连接,都将会生成一个session实例,服务器如何分辨谁是谁呢?那就是靠客户端发送请求过来的sessionId了。
安卓访问服务器遇到的问题
不同于浏览器访问服务器,android手机端在访问服务器时,http请求头部是没有sessionID的,而sessionID是识别用户身份的一条途径,安卓没有sessionId,就对用户身份识别造成了困难。
解决方案
无意中发现POSTMAN中有一栏这么个东西:
经过一番了解得知,Authorization用来验证是否拥有从服务器访问所需数据的权限。当发送请求时,通常必须包含参数,以确保请求具有访问和返回所需数据的权限。Postman提供了授权类型,可以轻松地在Postman本地应用程序中处理身份验证协议。
点击打开发现有12种类型,进一步发现其中有个Bearer Token的选项,看起来跟token作用很像啊。原来这是一个安全令牌,任何带有此参数的用户都可以用它访问服务器资源。
以上信息对我来说足够用了,于是构想了整个流程:
1.如果安卓端请求的就是登录接口,那么配置的拦截器对这个接口直接放行即可;放行后,服务端接收到登录请求,响应同时使用加密工具生成一段密文保存后返回给前端;
2.前端再次请求时,把Bearer Token数据放入header的Bearer Token中传给后端;
3.安卓端发送请求到后端,经登录拦截器拦截请求,取出Bearer Token和服务器存放的Bearer Token进行比较,如果相同,放行;不存在,则说明登录信息失效或者未登录,返回需要登录的信息;
实现
安卓端这里不多赘述,主要说明一下服务端的处理过程。
重点看一下拦截器的红框处即可,这里对token做了判断取值并比较,是因为项目涉及到了不同的登录终端,一个是普通的网页访问登录,另外一个就是安卓登录获取token的实现,通过调用初始化的用户数据进行对比判断是哪种终端登录的。
经过测试,服务器端是可以拿到这个值。如下:
登录接口对加密工具生成的token进行了保存并返回(不保存的话实时加密对比也是可以的,或者凭证入库更方便点),通过怎样的方式返回给客户端可以放入响应体或者响应头中,具体选择根据需要。