找回密码
 立即注册
查看: 4|回复: 0

24,ThreadLocal提供线程局部变量

[复制链接]

223

主题

6

精华

227

金币

技术维护QQ:515138

积分
484
发表于 昨天 21:16 | 显示全部楼层 |阅读模式
1,threadlocal工具类

  1. package com.jinhei.utils;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * ThreadLocal 工具类
  6. */
  7. @SuppressWarnings("all")
  8. public class ThreadLocalUtil {
  9.     //提供ThreadLocal对象,
  10.     private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
  11.     //根据键获取值
  12.     public static <T> T get(){
  13.         return (T) THREAD_LOCAL.get();
  14.     }
  15.        
  16.     //存储键值对
  17.     public static void set(Object value){
  18.         THREAD_LOCAL.set(value);
  19.     }
  20.     //清除ThreadLocal 防止内存泄漏
  21.     public static void remove(){
  22.         THREAD_LOCAL.remove();
  23.     }
  24. }
复制代码
2,拦截器里面设置和移除
  1. package com.jinhei.interceptors;
  2. import com.jinhei.utils.JwtUtils;
  3. import com.jinhei.utils.ThreadLocalUtil;
  4. import jakarta.servlet.http.HttpServletRequest;
  5. import jakarta.servlet.http.HttpServletResponse;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.web.servlet.HandlerInterceptor;
  8. import java.util.Map;
  9. @Component
  10. public class LoginInterceptor implements HandlerInterceptor {
  11.     @Override
  12.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  13.         //请求头里面拿到令牌,令牌验证
  14.         String token = request.getHeader("Authorization");
  15.         // 验证token
  16.         try {
  17.             Map<String, Object> claims = JwtUtils.parseJWT(token);
  18.             // 把业务数据保存到ThreadLocal中
  19.             ThreadLocalUtil.set(claims);
  20.             // 放行
  21.             return true;
  22.         } catch (Exception e) {
  23.             // HTTP响应码 401
  24.             response.setStatus(401);
  25.             // 不放行
  26.             return false;
  27.         }
  28.     }
  29.     @Override
  30.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  31.        // 移除ThreadLocal中的数据
  32.         ThreadLocalUtil.remove();
  33.     }
  34. }
复制代码
3,C层使用:
  1. package com.jinhei.controller;
  2. import com.jinhei.pojp.Result;
  3. import com.jinhei.pojp.User;
  4. import com.jinhei.service.UserService;
  5. import com.jinhei.utils.JwtUtils;
  6. import com.jinhei.utils.Md5Util;
  7. import com.jinhei.utils.ThreadLocalUtil;
  8. import jakarta.validation.constraints.Pattern;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.validation.annotation.Validated;
  12. import org.springframework.web.bind.annotation.*;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. /**
  16. * 用户相关接口
  17. */
  18. @RestController
  19. @RequestMapping("/user")
  20. @Slf4j
  21. @Validated
  22. public class UserController {
  23.     @Autowired
  24.     private UserService userService;
  25.     /**
  26.      * 用户注册
  27.      */
  28.     @PostMapping("/register")
  29.     public Result register(@Pattern(regexp = "^[a-zA-Z0-9_-]{5,20}$") String username,@Pattern(regexp = "^[a-zA-Z0-9_-]{6,20}$") String password) {
  30.         log.info("用户注册:username={},password={}", username, password);
  31.             // 查看用户是否存在
  32.             User user = userService.findByUsername(username);
  33.             // 注册用户
  34.             if (user == null){
  35.                 userService.register(username, password);
  36.                 return Result.success();
  37.             }else {
  38.                 return Result.error("用户已存在");
  39.             }
  40.         }
  41.     /**
  42.      * 用户登录
  43.      */
  44.     @PostMapping("/login")
  45.     public Result login(@Pattern(regexp = "^[a-zA-Z0-9_-]{5,20}$") String username,@Pattern(regexp = "^[a-zA-Z0-9_-]{6,20}$") String password) {
  46.         log.info("用户登录:username={},password={}", username, password);
  47.         // 查看用户是否存在
  48.         User user = userService.findByUsername(username);
  49.         // 登录用户
  50.         if (user == null){
  51.             return Result.error("用户不存在");
  52.         }
  53.        if (Md5Util.getMD5String(password).equals(user.getPassword())){
  54.            // 登录成功
  55.            // 生成JWT令牌
  56.            Map<String, Object> claims = new HashMap<>();
  57.            claims.put("id", user.getId());
  58.            claims.put("username", user.getUsername());
  59.            String token = JwtUtils.generateJwt(claims);
  60.            return Result.success(token);
  61.        }
  62.        return Result.error("密码错误");
  63.     }
  64.     @GetMapping("/userInfo")
  65.     public Result<User> userInfo(/*@RequestHeader(name = "Authorization") String token*/) {
  66.         //根据用户名查询用户
  67.        /* Map<String, Object> map = JwtUtils.parseJWT(token);
  68.         String username = (String) map.get("username");*/
  69.         Map<String, Object> map = ThreadLocalUtil.get();
  70.         String username = (String) map.get("username");
  71.         User user = userService.findByUsername(username);
  72.         return Result.success(user);
  73.     }
  74. }
复制代码




上一篇:23,时间日期不限制,字段不一致问题,驼峰命名配置和下划线自动转换
下一篇:25,@SuppressWarnings(&quot;all&quot;)注解
网站建设,公众号小程序开发,系统定制,软件App开发,技术维护【联系我们】手机/微信:17817817816 QQ:515138

QQ|Archiver|自丢网 ( 粤ICP备2024252464号-1 )

GMT+8, 2026-3-2 06:26

专注于网站建设,公众号小程序制作,商城小程序,系统定制,软件App开发

【联系我们】手机/微信:17817817816 QQ:515138

快速回复 返回顶部 返回列表