当前位置: 首页 > wzjs >正文

甘南州住房和城乡建设局网站什么网页游戏最火

甘南州住房和城乡建设局网站,什么网页游戏最火,nas 做网站服务器,crm系统排行榜总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 目录 总说 一、Redis功能测试 1.1 添加依赖 1.2 配置 1.3 调用API测试功能 二、令牌主动失效功能 2.1 Controller层 2.2 拦…

总说

过程参考黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili

目录

总说

一、Redis功能测试

1.1 添加依赖

1.2 配置

1.3 调用API测试功能

二、令牌主动失效功能

2.1 Controller层

2.2 拦截器

2.3 Controller层

2.4 测试


之前的登录逻辑,如果在修改密码后,我们会得到新的令牌,但是没有删除旧的令牌,导致用旧的令牌依然能够登录访问,所以我们在更新密码后应该要删除旧的令牌

在用户登录成功时,我们同时向 浏览器 和 Redis 发送令牌,当浏览器携带令牌访问其他资源时,在拦截器中,我们不仅要对令牌的合法性进行校验,还要和Redis的令牌比较,二者的令牌一模一样才能通过。

我们用Redis实现旧令牌的主动失效。在用户修改密码后,我们在Redis删除令牌就能实现。

一、Redis功能测试

1.1 添加依赖

来到pom.xml中,添加Redis依赖

<!-- redis依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.4.2</version>
</dependency>

1.2 配置

来到application.yml中,添加配置如下:

1.3 调用API测试功能

test目录下创建一个RedisTest测试对象

写入代码如下:

可能会有爆红,先不管他,项目能跑

@SpringBootTest //如果在测试类上添加这个注解,在单元测试方法执行之前,会先初始化Spring容器
public class RedisTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate; //这里爆红//测试存储@Testpublic void testSet(){//往redis中存储一个键值对 StringRedisTemplate//接受一个返回值ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();//实现数据存储operations.set("username","ZhangSan");}
}

没有redis,要先去安装redis

下完redis后,点击redis-server.exe启动redis

然后我们去启动测试类:

左边绿色,表示运行成功

然后我们再去redis,看看我们的键值对是否成功存入

打开redis-cil.exe

然后输入

get username

发现我们可以得到刚刚传入的键值对

我们再测试一下获取功能

完整代码如下:

@SpringBootTest //如果在测试类上添加这个注解,在单元测试方法执行之前,会先初始化Spring容器
public class RedisTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate; //这里爆红//测试存储@Testpublic void testSet(){//往redis中存储一个键值对 StringRedisTemplate//接受一个返回值ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();//实现数据存储operations.set("username","ZhangSan");}//测试存储@Testpublic void testGet(){//往redis中获取一个键值对ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();//实现数据读取 输入到控制台System.out.println(operations.get("username"));}
}

然后测试一下:

成功得到

二、令牌主动失效功能

2.1 Controller层

来到UserController,添加对象

@Resource
private StringRedisTemplate stringRedisTemplate;

修改login方法,将token存到redis中,修改完如下:

//登录方法 ,返回值token是一个字符串@PostMapping("/login")public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$")String password) {//1、根据用户名查询用户User user = userService.findByUserName(username);//返回一个查找到的User对象//2、判断用户是否存在if (user == null) { //没找到return Result.error("用户名不存在");}//3、判断密码是否正确 user对象中是加密过的密码if (Md5Util.getMD5String(password).equals(user.getPassword())) {//密码正确 登录成功//创建一个map,用于记录传入token的数据集合Map<String, Object> claims = new HashMap<>();claims.put("id", user.getId()); //传入id和用户名claims.put("username", user.getUsername());//生成tokenString token = JwtUtil.genToken(claims); //传入数据 并生成token//把token存储到redis中ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.set(token, token, 1, TimeUnit.HOURS);// 过期时间与token过期时间一致return Result.success(token);}return Result.error("密码错误");}

2.2 拦截器

来到拦截器

添加代码:

完整代码:

//@Component用于标识一个类是一个 Spring 管理的组件
@Component
public class LoginInterceptor implements HandlerInterceptor {@Resourceprivate StringRedisTemplate stringRedisTemplate;//preHandle方法会在请求处理之前被调用,可以在这里进行一些前置处理,比如登录验证@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌验证String token = request.getHeader("Authorization");//验证tokentry {//从redis中获取相同的tokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String redisToken = operations.get(token);if(redisToken == null) {//token已经失效throw new Exception(); // 抛出异常}Map<String, Object> claims = JwtUtil.parseToken(token); //解析token 解析后的内容是一个map//可以把业务数据存储到ThreadLocal中ThreadLocalUtil.set(claims);return true; //如果解析成功,代表登录过了,放行} catch (Exception e) { //如果解析失败,代表没有登录,拦截response.setStatus(401);return false; //拦截}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//在请求处理完成之后被调用,可以在这里进行一些后置处理,比如清理ThreadLocal中的数据ThreadLocalUtil.remove();}
}

2.3 Controller层

再次回到UserController,来到updatePwd方法

在用户更新完密码后,删除redis中对应的token

在return前面添加一句:

operations.getOperations().delete(token); // 删除token

updatePwd方法完整代码如下:

//更新密码@PatchMapping("/updatePwd")public Result updatePwd(@RequestBody Map<String, String> params,@RequestHeader("Authorization") String token){//1、校验参数String oldPwd = params.get("old_pwd");String newPwd = params.get("new_pwd");String rePwd = params.get("re_pwd");if (!StringUtils.hasLength(oldPwd) || !StringUtils.hasLength(newPwd) || !StringUtils.hasLength(rePwd)) {return Result.error("缺少必要参数");}//2、检验密码是否正确Map<String, Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");// 在线程中获取用户名usernameUser user = userService.findByUserName(username); //根据用户名查询用户if(!user.getPassword().equals(Md5Util.getMD5String(oldPwd))) {return Result.error("原密码不正确");}//2次填写密码是否一致if(!rePwd.equals(newPwd)) {return Result.error("两次密码不一致");}//3、调用service完成密码更新userService.updatePwd(newPwd);//删除redis中对应的tokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.getOperations().delete(token); // 删除tokenreturn Result.success();}

2.4 测试

先启动redis和项目

来到更新用户密码接口,更新一下用户密码

修改成功之后,我们重新去登录接口

发现我们用更新后的密码可以登录成功,更新前的密码不能登录

而且在不更换token的情况下,我们不再能访问其他接口。

功能实现完成。上传git保存一下


文章转载自:

http://p8wbA2Y0.gbsby.cn
http://x8vB0flX.gbsby.cn
http://8p75jcj5.gbsby.cn
http://PiTluOfK.gbsby.cn
http://ofkTBsqU.gbsby.cn
http://aC2VAsgu.gbsby.cn
http://Z6z3Og5h.gbsby.cn
http://arT0Xkm5.gbsby.cn
http://yJFAQFO3.gbsby.cn
http://kStlgLay.gbsby.cn
http://7mFI4L9V.gbsby.cn
http://XAm0xaDn.gbsby.cn
http://6IE3gUPZ.gbsby.cn
http://efBWFhig.gbsby.cn
http://1UG8gf1D.gbsby.cn
http://i71qyKTZ.gbsby.cn
http://NdPHRtM9.gbsby.cn
http://QFEgudzr.gbsby.cn
http://T1LzqECz.gbsby.cn
http://UpxygX5t.gbsby.cn
http://ybiI7X8L.gbsby.cn
http://GLBH2Rd6.gbsby.cn
http://ahTViPze.gbsby.cn
http://tNwQ7Aq9.gbsby.cn
http://XJhYRBra.gbsby.cn
http://TTVoJxdj.gbsby.cn
http://l16wmFrj.gbsby.cn
http://ZU2aYgoY.gbsby.cn
http://d8yzeH42.gbsby.cn
http://sG2Jc46R.gbsby.cn
http://www.dtcms.com/wzjs/611669.html

相关文章:

  • 怎么做全息网站上饶做网站公司
  • 宜昌做网站要什么条件和国外做贸易用什么网站
  • 大连自媒体公司网站优化流程图
  • 欧美做的爱爱网站网页设计用什么尺寸的画布
  • 郑州公司网站开发标准营销型网站定做价格
  • 那些行业做网站优化的比较多中国造价工程建设监理协会网站
  • python可以做网站企业网站建设方案详细方案
  • 台州网站建设系统怎样在文章后做网站链接
  • 做网站素材网外贸公司网站设计哪家好
  • 医院网站建设招标国外flash网站模板
  • 温州网站的建设用wordpress建站难吗
  • 网站建设合同司法解释太原网站建设方案咨询
  • 建设部网站施工合同抖音自媒体平台注册
  • 海口网站设计保定网站建设求职简历
  • 电商网络营销seo排名哪家有名
  • 织梦做的网站进不去分分作网站
  • 网站脚本错误深圳互联网设计开发
  • 网文订阅做多的网站国家工商注册网
  • 网站制作合同模板建筑工程网官网入口
  • 任丘做网站wordpress是什么平台
  • 建站公司经营seo培训班
  • 怎么制作游戏短视频临沂 网站优化
  • win2012服务器做网站wordpress修改发布页面插件
  • 昆山网站建设推荐北京网站建设推广
  • 网站建设赶集网韩国优秀平面设计网站有哪些
  • 东莞网站推广宣传wordpress放音乐播放器
  • 网上提供免费主页空间的网站旅游交友的网站建设
  • 把网站内容全删掉 在重新建立会不会被k西昌网站建设
  • 牡丹江seo网站推广蜘蛛屯优化排名教育培训网络推广培训
  • 网站开发的软 硬件环境标准cdn网站加速 免备案