wordpress相关网站,嘉兴免费做网站,顺义建站好的公司,三亚兼职招聘信息网站原文地址#xff1a;https://blog.yiming1234.cn/?p830
下面是正文内容#xff1a;
前言 通过SpringBoot开发用户模块的部分也就差不多要结束了#xff0c;这一片文章就主要提一些在系统开发中需要注意到的细节部分和功能#xff0c;也就是剩余的部分。 但是这个专栏只介…原文地址https://blog.yiming1234.cn/?p830
下面是正文内容
前言 通过SpringBoot开发用户模块的部分也就差不多要结束了这一片文章就主要提一些在系统开发中需要注意到的细节部分和功能也就是剩余的部分。 但是这个专栏只介绍了系统后端用户模块的开发因为用户模块在大部分java后端的开发上都是通用必须掌握的。 而系统需要实现的具体功能比如说文章的发表出入库的登记查询等等则需要另起专栏去进行描述。 正文 获取更新用户信息/更新用户密码 由于这一部分接口的开发和前面提到的注册登录接口的开发步骤大同小异所以就合并之后简单描述一下了。 Controller层UserController.java GetMapping(/userinfo)public ResultUser userinfo(/*RequestHeader(name Authorization) String token*/){//根据用户名查询用户/*MapString, Object map JwtUtil.parseToken(token);String username (String) map.get(username);*/MapString, Object map ThreadLocalUtil.get();String username (String) map.get(username);User user userService.findByUserName(username);return Result.success(user);}PtachMapping(/update)public ResultUser update(RequestBody User user){userService.update(user);return Result.success();}PatchMapping(/updateAvatar)public Result updateAvater(RequestParam URL String avatarUrl){userService.updateAvatar(avatarUrl);return Result.success();} Service层UserServiceImpl.java Overridepublic void update(User user){user.setUpdateTime(LocalDateTime.now());userMapper.update(user);}Overridepublic void updateAvatar(String avatarUrl){MapString,Object map ThreadLocalUtil.get();Integer id (Integer) map.get(id);userMapper.updateAvatar(avatarUrl,id);}Overridepublic void updatePwd(String newPwd){MapString,Object map ThreadLocalUtil.get();Integer id (Integer) map.get(id);userMapper.updatePwd(Md5Util.getMD5String(newPwd),id);} Mapper层UserMapper.java Update(update user set nickname#{nickname},email#{email},update_time#{updateTime} where id#{id})void update(User user);Update(update user set user_pic#{avatarUrl},update_timenow() where id#{id})void updateAvatar(String avatarUrl, Integer id);Update(update user set password#{md5String},update_timenow() where id#{id})void updatePwd(String md5String, Integer id); 更改密码后Jwt令牌的及时失效 需要用到Redis服务。 Redis是一个开源的、基于内存的数据结构存储系统可以用作数据库、缓存和消息代理。 作为缓存存储系统非常流行可以将经常访问的数据存储在内存中以加快读取速度减轻后端数据库的负载。可用于存储会话数据以实现分布式会话管理提高可扩展性和性能。 首先从github上下载redis Releases · tporadowski/redis · GitHub 解压后cd命令切换至根目录下启动看到下面的界面 redis-server.exe redis.windows.conf 然后在pom.xml中添加下面的字段 !--redis依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency 将application.yml修改为如下 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/big_eventusername: rootpassword: rootdata:redis:host: localhostport: 6379mybatis:configuration:map-underscore-to-camel-case: true #开启驼峰命名和下划线命名的自动转换 针对Redis需要做出的修改登录成功后需要将token储存至Redis中系统内页面在访问时验证需要从Redis中获取token密码更新后需要删除Redis中对应的token。 修改UserController.java中的内容 Autowiredprivate StringRedisTemplate stringRedisTemplate;
PostMapping(/login)public ResultString login(Pattern(regexp ^\\S{5,16}$) String username, Pattern(regexp ^\\S{5,16}$) String password){//根据用户名查询用户User loginUser userService.findByUserName(username);//判断该用户是否存在if (loginUsernull){return Result.error(用户名不存在);}//判断密码是否正确,传入参数加密后与数据库中的密文进行比对if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {//登录成功MapString,Object claims new HashMap();claims.put(id,loginUser.getId());claims.put(username,loginUser.getUsername());String token JwtUtil.genToken(claims);//把token存储到redis中ValueOperationsString, String operations stringRedisTemplate.opsForValue();operations.set(token,token, 1, TimeUnit.HOURS);return Result.success(token);}return Result.error(密码错误);} PatchMapping(/updatePwd)public Result updatePwd(RequestBody MapString, String params,RequestHeader(Authorization) String token){//校验参数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(缺少必要的参数);}//原密码是否正确调用原密码和old_pwd进行比较MapString, Object map ThreadLocalUtil.get();String username (String) map.get(username);User loginUser userService.findByUserName(username);if(!loginUser.getPassword().equals(Md5Util.getMD5String(oldPwd))){return Result.error(原密码错误);}if(!rePwd.equals(rePwd)){return Result.error(两次填写的密码不一致);}//调用service完成密码更新userService.updatePwd(newPwd);//删除redis中对应的tokenValueOperationsString, String operations stringRedisTemplate.opsForValue();operations.getOperations().delete(token);return Result.success(密码修改成功);} 修改LoginInterceptor.java中的内容 Autowiredprivate StringRedisTemplate stringRedisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌验证String token request.getHeader(Authorization);//验证tokentry {//从redis中获取相同的tokenValueOperationsString, String operations stringRedisTemplate.opsForValue();String redisToken operations.get(token);if (redisTokennull){throw new RuntimeException();}MapString, Object claims JwtUtil.parseToken(token);//把业务数据储存到ThreadLocal中ThreadLocalUtil.set(claims);//放行return true;} catch (Exception e) {response.setStatus(401);//不放行return false;} SpringBoot项目部署 SpringBoot项目在后端程序员电脑上正常运行之后就需要打包上传至公司服务器进行项目部署。 在pom.xml中 dependecies和/project之间添加下面的字段用于打包 buildplugins!--打包操作--plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion3.2.3/version/plugin/plugins/build 在右侧边栏找到package字样点击运行等程序跑完。 这里需要注意的是SpringBoot在进行自动化打包的时候是会默认测试Test环境下的java类能否正常运行的。要么在打包的时候选择skip跳过要么就确保测试类能够正常运行。 如果配置了Redis那么也同时需要把redis打开。 还有就是打包的时候要把项目关了不然就会报错8080端口占用。 可以看到已经打包成功了这里就不上传服务器假设本地Windows电脑为服务端进行测试 jdk需要至少版本17找到打包好的jar包直接java -jar system-1.0-SNAPSHOT.jar启动 由于还没有编写前端页面所以还是只能通过Apifox来进行试验这里就进行演示了。 结束 其实还有一些比如说多环境测试开发生产下的开发本地电脑属性的配置等等内容没有介绍但由于是小项目没有这个必要所以也就不进行过多的赘述了。 关于后端系统开发的专栏就暂且告一段落了。 尾声 后面开始就要进行Vue.js的工程化部署以及前后端的连接了大家可以点个关注跟进一下。