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

Spring Boot 笔记 008 创建接口_获取用户信息

1.1.1 编写userinfo接口

1.1.2 User实体类中增加转json忽略password注释

package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;import java.time.LocalDateTime;//lombok 在编译阶段为实体类自动生成setter,getter,tostring
//步骤:pom文件中引入依赖,在实体类上添加注解
@Data
public class User {private Integer id;//主键IDprivate String username;//用户名@JsonIgnoreprivate String password;//密码private String nickname;//昵称private String email;//邮箱private String userPic;//用户头像地址private LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间
}

1.1.3.1 实体类驼峰命名和数据库下划线命名无法匹配

1.1.3.2 需要在配置文件中配置

1.1.3 在postman中测试

1.2 从拦截器中获取解析完的token而不是在controller中自己解析

1.2.1 编写工具类ThreadLocalUtil

package com.geji.utils;import java.util.HashMap;
import java.util.Map;/*** ThreadLocal 工具类*/
@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}

1.2.2 在拦截器中放数据,并且记得清数据防止内存泄漏

package com.itheima.interceptors;import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtil;
import com.itheima.utils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import java.util.Map;@Component
public class LoginInterceptor implements HandlerInterceptor {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@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 RuntimeException();}Map<String, Object> claims = JwtUtil.parseToken(token);//把业务数据存储到ThreadLocal中ThreadLocalUtil.set(claims);//放行return true;} catch (Exception e) {//http响应状态码为401response.setStatus(401);//不放行return false;}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//清空ThreadLocal中的数据ThreadLocalUtil.remove();}
}

1.2.3 在userinfo中拿数据

package com.geji.controller;import com.geji.pojo.Result;
import com.geji.pojo.User;
import com.geji.service.UserService;
import com.geji.utils.JwtUtil;
import com.geji.utils.Md5Util;
import com.geji.utils.ThreadLocalUtil;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/user")
@Validated
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {//查询用户User u = userService.findByUserName(username);if (u == null) {//没有占用//注册userService.register(username, password);return Result.success();} else {//占用return Result.error("用户名已被占用");}}@PostMapping("/login")public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {//根据用户名查询用户User loginUser = userService.findByUserName(username);//判断该用户是否存在if (loginUser == null) {return Result.error("用户名错误");}//判断密码是否正确  loginUser对象中的password是密文if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {//登录成功Map<String, Object> claims = new HashMap<>();claims.put("id", loginUser.getId());claims.put("username", loginUser.getUsername());String token = JwtUtil.genToken(claims);//把token存储到redis中
//            ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
//            operations.set(token,token,1, TimeUnit.HOURS);return Result.success(token);}return Result.error("密码错误");}@GetMapping("/userInfo")public Result<User> userInfo() {Map<String, Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");User user = userService.findByUserName(username);return Result.success(user);}
}

http://www.lryc.cn/news/299014.html

相关文章:

  • EMC学习笔记(二十六)降低EMI的PCB设计指南(六)
  • pytorch花式索引提取topk的张量
  • Swagger2
  • 2024/2/13
  • 【工具】Android|Android Studio 长颈鹿版本安装下载使用详解
  • 第三代互联网web3.0
  • FL Studio版本升级-FL Studio怎么升级-FL Studio升级方案
  • 服务降级(Sentinel)
  • Rust入门问题: use of undeclared crate or module `rand`
  • 2024.2.6 模拟实现 RabbitMQ —— 数据库操作
  • dolphinscheduler海豚调度(一)简介快速体验
  • VTK 三维场景的基本要素(相机) vtkCamera
  • 小游戏和GUI编程(5) | SVG图像格式简介
  • 多机多卡运行nccl-tests和channel获取
  • SQL,HQL刷题,尚硅谷
  • DevOps:CI、CD、CB、CT、CD
  • [leetcode经典算法题]删除有序数组中的重复项(双指针)
  • 【国产MCU】-CH32V307-触摸按键检测(TKEY)
  • Hive的小文件问题
  • 攻防世界——re2-cpp-is-awesome
  • 问山海——天涯海角——桃花渊boss攻击顺序
  • springboot181基于springboot的乐享田园系统
  • Dubbo集成Zookeeper embbed模式
  • 156基于Matlab的光纤陀螺随机噪声和信号
  • 秋招上岸大厂,分享一下经验
  • 使用 C++23 从零实现 RISC-V 模拟器
  • Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战
  • powershell 雅地关闭UDP监听器
  • Google Cloud 2024 年报告重点介绍了关键的网络威胁和防御
  • 【算法题】102. 二叉树的层序遍历