1,threadlocal工具类
- package com.jinhei.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();
- }
- }
复制代码 2,拦截器里面设置和移除
- package com.jinhei.interceptors;
- import com.jinhei.utils.JwtUtils;
- import com.jinhei.utils.ThreadLocalUtil;
- import jakarta.servlet.http.HttpServletRequest;
- import jakarta.servlet.http.HttpServletResponse;
- import org.springframework.stereotype.Component;
- import org.springframework.web.servlet.HandlerInterceptor;
-
- import java.util.Map;
- @Component
- public class LoginInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- //请求头里面拿到令牌,令牌验证
- String token = request.getHeader("Authorization");
- // 验证token
- try {
- Map<String, Object> claims = JwtUtils.parseJWT(token);
- // 把业务数据保存到ThreadLocal中
- ThreadLocalUtil.set(claims);
- // 放行
- return true;
- } catch (Exception e) {
- // HTTP响应码 401
- response.setStatus(401);
- // 不放行
- return false;
- }
- }
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- // 移除ThreadLocal中的数据
- ThreadLocalUtil.remove();
- }
- }
复制代码 3,C层使用:
- package com.jinhei.controller;
-
- import com.jinhei.pojp.Result;
- import com.jinhei.pojp.User;
- import com.jinhei.service.UserService;
- import com.jinhei.utils.JwtUtils;
- import com.jinhei.utils.Md5Util;
- import com.jinhei.utils.ThreadLocalUtil;
- import jakarta.validation.constraints.Pattern;
- import lombok.extern.slf4j.Slf4j;
- 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;
-
- /**
- * 用户相关接口
- */
- @RestController
- @RequestMapping("/user")
- @Slf4j
- @Validated
- public class UserController {
- @Autowired
- private UserService userService;
- /**
- * 用户注册
- */
- @PostMapping("/register")
- public Result register(@Pattern(regexp = "^[a-zA-Z0-9_-]{5,20}$") String username,@Pattern(regexp = "^[a-zA-Z0-9_-]{6,20}$") String password) {
- log.info("用户注册:username={},password={}", username, password);
-
- // 查看用户是否存在
- User user = userService.findByUsername(username);
- // 注册用户
- if (user == null){
- userService.register(username, password);
- return Result.success();
- }else {
- return Result.error("用户已存在");
- }
- }
-
- /**
- * 用户登录
- */
- @PostMapping("/login")
- public Result login(@Pattern(regexp = "^[a-zA-Z0-9_-]{5,20}$") String username,@Pattern(regexp = "^[a-zA-Z0-9_-]{6,20}$") String password) {
- log.info("用户登录:username={},password={}", username, password);
- // 查看用户是否存在
- User user = userService.findByUsername(username);
- // 登录用户
- if (user == null){
- return Result.error("用户不存在");
- }
- if (Md5Util.getMD5String(password).equals(user.getPassword())){
- // 登录成功
- // 生成JWT令牌
- Map<String, Object> claims = new HashMap<>();
- claims.put("id", user.getId());
- claims.put("username", user.getUsername());
- String token = JwtUtils.generateJwt(claims);
- return Result.success(token);
- }
- return Result.error("密码错误");
- }
-
- @GetMapping("/userInfo")
- public Result<User> userInfo(/*@RequestHeader(name = "Authorization") String token*/) {
- //根据用户名查询用户
- /* Map<String, Object> map = JwtUtils.parseJWT(token);
- String username = (String) map.get("username");*/
- Map<String, Object> map = ThreadLocalUtil.get();
- String username = (String) map.get("username");
- User user = userService.findByUsername(username);
- return Result.success(user);
- }
- }
复制代码
|