1、java客户端
redis作为流行的缓存软件,支持非常丰富的语言客户端,例如java,c c#,d ruby,go R等等。我们是java语言的客户端–jedis。
2.jedis的代码测试
2.1工程中添加相关依赖资源
org.springframework.boot
spring-boot-starter-redis
2.2测试案例
○ 使用jedis对象链接操作一个redis服务节点
/*
如何使用jedis链接到对应的redis服务端
*/
@Test
public void test01(){
//相当于从java代码执行 redis-cli -h 10.9.104.184 -p 6379
Jedis jedis=new Jedis("10.9.104.184",6379);
//可以利用jedis对象调用api方法操作redis
jedis.set("name","王老师");
System.out.println(jedis.get("name"));
jedis.exists("name");
jedis.lpush("list01","1");
jedis.rpop("list01");
jedis.hset("user","age","18");
}
利用jedis对象实现登陆逻辑
了解登陆执行,用户状态获取的流程(对应接口文件中2个方法)
登陆
后台接收 | /user/manage/login |
---|---|
请求方式 | Post |
请求参数 | User user 只有用户名和密码,查询需要加密password |
返回数据 | 返回SysResult对象的json,其结构:Integer status; 200表示成功,其他表示失败;String msg;成功返回 “ok”,失败返回其他信息Object data;根据需求携带其他数据 |
备注 | 更具查询结果 ,判断登陆合法。决定如何使用redis存储数据。在成功时编写cookie相关代码实现将数据关键key返回(ticket) |
UserController
//接受登陆请求,判断合法和存储redis
@RequestMapping("login")
public SysResult doLogin(User user, HttpServletRequest req, HttpServletResponse res){
//判断 业务层返回数据,是否生成了存储在redis中的key值 ticket
String ticket= us.doLogin(user);
if("".equals(ticket)||ticket==null){
//说明业务层么有存储redis,说明用户名密码不正确
//登陆失败
return SysResult.build(201,"登陆失败",null);
}else{
//正确存储到redis 登陆成功,控制层使用cookie技术,将返回ticket值
//带会给浏览器,浏览器客户端才能在登陆之后,有了一张类似票的概念的数据
//后续访问系统只要判断这张票是否合法 是否超时。
//调用common-resources cookieUtils
//其中set方法需要request和response对象 在controller里可以从springmvc拿到
CookieUtils.setCookie(req,res,"EM_TICKET",ticket);
//返回数据,告诉ajax登陆成功的
return SysResult.ok();
}
}
UserServic
ObjectMapper两个api方法
writeValueAsString:将对象转化成json。
readValue:将json字符串转化成对象。
public String doLogin(User user){
/*
1 判断合法
2 存储redis
*/
// 准备一个返回的字符串,默认值""
String ticket="";
//使用user参数 查询数据库,判断是否存在user行数据 验证合法
//user里明文password加密
user.setUserPassword(MD5Util.md5(user.getUserPassword()));
User exist=um.selectUserByNameAndPw(user);//select * from t_user where name= and pw=
if(exist==null){
//说明没有查询到user对象登陆时不合法的
return ticket;
}else{//说明合法数据
//创建key-value的数据将用户信息存储在redis供客户端后续访问使用
//准备一个数据 userJson字符串 可以将密码做空 redis的value
//调用一个对象的api方法 ObjectMapper 可以将json和对象进行相互转化 writeValueAsString
//readValue
exist.setUserPassword(null);
//将exist 转化成字符串
ObjectMapper om= MapperUtil.MP;
//准备好链接redis的对象jedis
Jedis jedis=new Jedis("10.9.104.184",6380);
try{
String uJson = om.writeValueAsString(exist);
//给ticket赋值,ticket体现特点:用户不同时,ticket要不同,同一个用户,不同
//时间登陆,生成的ticket也不同
ticket="EM_TICKET"+System.currentTimeMillis()+user.getUserName();
//需要存储在redis的key值和value都准备号了,下面可以set方法调用6380
jedis.setex(ticket,60*60*2,uJson);//不能set永久数据,假设超时时间2小时
}catch(Exception e){
e.printStackTrace();
return "";
}finally {
if(jedis!=null){
jedis.close();
}
}
//当上述逻辑全部执行完毕,ticket该赋值,就赋值了
return ticket;
}
}
获取登陆存储用户信息
在登录逻辑执行完毕之后,用户浏览器访问登录,填写用户名密码,就会出现浏览器中cookie里保存的ticket(redis中存储该用户数据的key值)。一旦访问了easymall任何一个页面,都会调用一段js代码。
js代码的逻辑:
□ 获取浏览器cookie的EM_TICKET
□ 判断是否为空ticket
为空:说明用户没有登陆过
不为空:说明登录过将会发送请求携带ticket到达服务器进行用户数据userJson的获取,获取之后将返回结果拼接到标签中,显示欢迎**回来
接口文件
后台接收 | /user/manage/query/{ticket}} |
---|---|
请求方式 | Get |
请求参数 | String ticket 就是用户登录时生成的rediskey值 |
返回数据 | 返回SysResult对象的json,其结构:Integer status; 200表示成功,其他表示失败。String msg;成功返回 “ok”,失败返回其他信息。Object data;封装从redis获取的userJson。 |
UserController
//获取用户登陆后存储在redis中的数据
@RequestMapping("query/{ticket}")
public SysResult queryUserData(@PathVariable String ticket){
//调用业务层,执行redis链接获取数据逻辑
String userJson=us.queryUserData(ticket);
//有ticket就一定去得到数据吗?不一定,设置了登陆状态超时。
if(userJson==null){
//有ticket,但是redis没有userJson说明确实登陆过,但是已经超时了
//返回201,不携带任何数据 data
return SysResult.build(201,"登录可能超时",null);
}else{
//ticket也有登陆过,userJson也有表示没超时,登录状态是正常使用的
return SysResult.build(200,"登录可用",userJson);
}
}
UserService
//根据ticket查询redis中数据
public String queryUserData(String ticket){
//创建jedis对象
Jedis jedis=new Jedis("10.9.104.184",6380);
//保证使用完毕,关闭对象
try{
//get方法返回get数据
return jedis.get(ticket);
}catch(Exception e){
e.printStackTrace();
return null;
}finally {
if(jedis!=null){
jedis.close();
}
}
}
zuul网关会对cookie默认进行过滤
认为cookie等头信息,是不安全的。默认删掉了,前面request中的cookie到不了服务器,后面服务器中reponse的cookie也到不了前端浏览器
需要在zuul中关闭敏感头:
#关闭敏感头
zuul.sensitive-headers=