开发在线法律咨询平台的设计与实现Day2
今日完成
开发获取用户信息接口
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);
}
开发中遇到的问题
一、无法获取对象
问题描述: 程序可以从数据库中拿到数据,却无法存在对象中。
解决过程: 配置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();