redis(三)-java客户端

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=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值