利用redis来实现身份验证的一种方法,类似session机制

HTTP协议是一种没有状态的协议,也就是说它不记录请求消息是谁发送的。这里我们把发送请求的称为客户端,接收请求并根据请求返回数据的称为服务端。

HTTP协议传输就导致了一个问题:一个服务端,只要有请求URL,谁都可以访问服务端应用。显然这不符合大多数服务端的安全性要求。所以应当做到的是:

客户端在通过用户名和密码进行了身份验证之后,下回这个客户端再发送请求的时候,服务器要能识别出来发送这个请求的客户端是谁,也就是再验证一次。

如何做到?一般是采用session机制:

1.用户请求登录,用户名和密码没有问题,登录成功之后,服务端生成一条记录,这个记录可以说明登录的用户是谁。

2.服务端把这条记录的ID发送给客户端,客户端收到这个ID之后,存在cookie里。

3.客户端每次发送请求,都会带着这个cookie。

4.服务端会验证一下这个cookie里的信息,如果能在服务端找到cookie里对应的信息,则身份验证通过,能够把数据返回给客户端。

以上就是我们常说的session机制的原理。下面来讲讲如何用redis实现上述类似想法的身份验证。

1.在服务端安装redis,redis是一种存储在内存中的数据库,以键值对的方式存储数据的。(如何安装redis,再与服务器项目连接,可以另去redis官网学一下。)

2.在登录验证的代码中我们要写的核心代码和解释如下:

private Jedis jedis = JedisUtil.getInstance().getJedis("127.0.0.1", 6379);//定义jedis对象,用来操作redis
Map<String, String> resultMap = new HashMap<>();//定义一个HashMap,放入传回给客户端的数据和一个token
Map<String, String> jedisMap = new HashMap<>();//定义一个HashMap,放入我们想存储的数据
jedisMap.put("accountId", loginAccount.getId().toString());
jedisMap.put("accountName", loginAccount.getName().toString());//把账户ID、name等我们需要的信息存储在map中
 
String token = Base58Helper.compressedUUID();//定义一个token字符串,Base58Helper.compressedUUID是自定义的生成的是唯一的字符串的方法
jedis.hmset(token, jedisMap);//向redis中存入键值对,键名:token;值:jedisMap。即把我们想要的数据以map形式存入redis,标记为token。
jedis.expire(token, 6000);//定义token的失效时间
 
resultMap.put("token", token);//把token放入到resultMap(resultMap可能还有其他客户端想要的数据,token只是其中一个)中,返回给客户端。
3.客户端接收到登录之后需要的数据和token之后,每次再请求时,发送请求参数和token,服务端就可以根据token进行身份验证了。
jedis.exists(token);//服务端判断redis中,是否存在token。
--------------------- 
作者:ClareQi 
来源:CSDN 
原文:https://blog.csdn.net/clareqi/article/details/52689115 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/bfboys/article/details/83148280