开发在线法律咨询平台的设计与实现Day2

尤所不同 / 2024-09-25 / 原文

今日完成

开发获取用户信息接口

http://localhost:8080/user/userinfo

@GetMapping("/userinfo")
public Result<User> getUserInfo(@RequestHeader(name = "Authorization")String token){
        Map<String,Object> map = JwtUtil.parseToken(token);
        String username = (String)map.get("username");
        User user = userService.findByUserName(username);
        return Result.success(user);
    }

image

开发中遇到的问题

一、无法获取对象

问题描述: 程序可以从数据库中拿到数据,却无法存在对象中。

解决过程: 配置map-underscore-to-camel-case: true
具体实现:

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #下划线命名法自动映射为驼峰命名法的功能。解决了数据库中表字段名与实体类属性名不一致的问题。

二、获取用户信息过于繁琐

问题描述: 每次请求访问时,要想拿到token中存取的数据,都要在每个方法中以参数的形式获取请求头中的Authorization,在解析token,太过繁琐。

解决过程: 由于在请求拦截时每次都会获取一次Authorization并解析token,我们只需要引入ThreadLocal来提供线程局部变量,在请求拦截时把解析后的token存储在ThreadLocal线程中,然后在每个请求方法下使用ThreadLocal.get()方法就可以拿到。
具体实现:
封装一个工具类

public class ThreadLoaclUtil {
    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);
    }
    // 移除线程变量
    public static void remove() {
        THREAD_LOCAL.remove();
    }
}

请求拦截前

ThreadLoaclUtil.set(claims);

一次响应结束后

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        ThreadLoaclUtil.remove();
    }

需要token解析参数时

Map<String,Object> map = ThreadLoaclUtil.get();