前两天新项目,做了一个关于图片验证码的功能,其实思路什么很简单,就是直接调用接口,给前端输出图片流。在输出流的时候,把验证码给存到session中去,然后验证的时候,在从session中取值。从而进行验证验证码是否正确。如果是单一的服务器的话是没问题的,但是遇到了集群的话,可能就会出错了。因为一个域名是随机面对的一个服务器的ip,然后你进行图片验证的时候,每次ajax进行的请求,服务器会认为是新的一次请求(前后端分离也是这个问题),然后新的一次请求,取到的验证码肯定就不对了,下面说一下解决方法。
解决方法:
将验证码存入到redis中去,然后key值就是uuid,value值就是code值,然后每次前台调用图片验证码接口的时候,会返回一个uuid,和一个将图片流base64编码的字符串。然后每次前台验证的时候,需要给我传这个uuid,然后我在进行通过取uuid的value值进行验证。其实这个解决方法的关键就是将原先的图片流换成了base64编码。
然后下面则写一下两种图片验证的方式代码。
一、传统的方法,直接给前台输出图片流,然后将code值存入session中(单一服务器可行,集群情况下会出错)
二、将code值直接存到一个以uuid为key的redis中去,同时给前端返回的验证码图片是一个base64编码的字符串。
前端的图片显示需要这种格式:<img src = "data:image/jpeg;base64,这里加上你的base64码" alt="">