获取用户详情ThreadLocal 更新用户头像 当没有实体类接收json参数时使用Map来接收 实体类转换成JSON是指定日期格式
一、ThreadLocal用于提供线程局部变量ThreadLocal会为每个线程创建独立空间。1.基本使用public class ThreadLocalTest { Test public void testThreadLocal(){ //提供一个ThreadLocal对象 ThreadLocal tl new ThreadLocal(); new Thread(()-{ tl.set(晓燕); System.out.println(Thread.currentThread().getName()tl.get()); System.out.println(Thread.currentThread().getName()tl.get()); System.out.println(Thread.currentThread().getName()tl.get()); }, 蓝色).start(); new Thread(()-{ tl.set(yaochen); System.out.println(Thread.currentThread().getName()tl.get()); System.out.println(Thread.currentThread().getName()tl.get()); System.out.println(Thread.currentThread().getName()tl.get()); },绿色).start(); } }2.实战我们实际开发中可以定义一个工具类定义一个全局唯一的ThreadLocal;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(); } }在SpringMVC中一次请求一个线程。因为tomcat维护一个线程池你发起一次请求给你分一个线程。我们可以在解析令牌的时候顺手将信息存入ThreadLocal这样就不用到处拿着JWT令牌解析了Component public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{ String token request.getHeader(Authorization); try{ MapString, Object claims JwtUtils.parseToken(token); //将用户名存储到ThreadLocal中 ThreadLocalUtil.set(claims); return true; }catch(Exception e){ response.setStatus(401); return false; } } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception { ThreadLocalUtil.remove(); } }GetMapping(/userInfo) public ResultUser userInfo(/*RequestHeader(Authorization) String token*/){ //MapString, Object map JwtUtils.parseToken(token); //String username (String) map.get(username); //从ThreadLocal中获取用户名 MapString, Object claims ThreadLocalUtil.get(); String username (String) claims.get(username); User user userService.findByUserName(username); return Result.success(user); }二、更新头像1.思路获取头像url更新url三、Map接收json数据有的时候我们没有用实体类封装请求参数就可以使用map临时封装。只需要在参数前加个RequestBody即可四、实体类转换成JSON是指定日期格式在实体类中的日期属性上加上JsonFormat注解即可。由Spring继承的Jackson提供发生时机当将java类转换成JSON时会进行这个格式化所以返回给前端的数据是格式化的。反序列化回对象后还是原本的格式Data AllArgsConstructor NoArgsConstructor public class Category implements Serializable { private Integer id;//主键ID NotEmpty private String categoryName;//分类名称 NotEmpty private String categoryAlias;//分类别名 private Integer createUser;//创建人ID JsonFormat(pattern yyyy-MM-dd HH:mm:ss) private LocalDateTime createTime;//创建时间 JsonFormat(pattern yyyy-MM-dd HH:mm:ss) private LocalDateTime updateTime;//更新时间 }