接口文档的要求:
了解一下token令牌头是怎么用的
我们直接放到前端交互的controller类下,在声明的方法中加入参数为String token且加入注解@RequestHeader(name="Authorization【你自己设定的token】")
设计思路:
实战开发:
controller的开发:
//查询用户
@GetMapping("/userInfo")
//传入token参数
public Result userInfo(@RequestHeader("Authorization") String token) {
//解密token
Map<String,Object> mao=JwtUtil.parseToken(token);
//得到名字
String username=(String)mao.get("username");
//查询信息
User user=userService.findUserByUsername(username);
return Result.success(user);
}
结果:
注意问题1:
如果在测试的的时候发现数据中包含了我们不应该返返回的数据,如用户的密码:
解决方案:
在对应的实体类下的对应password字段前加入注解:
@JsonIgnore
作用是让SpringMVC在把当前对象转化成json字符串的时候,忽略password,最终的json字符串中就没有password这个属性了
注意问题2:
注意看以上的返回数据中的几个创建时间是“null”,不是因为数据表中没有对应的信息,而是数据表的命名是create_Time,而不是驼峰命名的createTime,两者的命名规则不同,所以获取不到数据。
解决策略:
【在yml文件下加入mybatis的命名规则即可】
mybatis:
configuration:
map-underscore-to-camel-case: true #开启驼峰命名和下划线命名的自动发转换
解析token的问题更进:
咱们在controller中在前面不是注入了token的解析变量么?但是咱们之前在拦截器上已经解析过了,再在controller里去解析的话,只会成为代码累赘,那么我们这期就是来解决这个问题!
TreadLocal:
给了不同线程之间的隔离性,实现你是你的线程,我是我的线程,两者互不干扰。
那么同时有两个线程去执行的话呢,执行效果如下:
开始操作:
1.注释controller相关解析token的代码
咱们先把controller内的token解析注释掉
2.导入ThreadLocalUtil工具类
package org.huangyingyuan.utils;
/**
* 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();
}
}
3.在拦截器内部创建去存我们的一个线程
咱们应该在拦截器内部去创建一个ThreadLocalUtil对象去存我们的一个线程,进行全局调用
注意!清空数据
我们获取到TreadLocalUtil对象后,得到的数据是一次性使用,使用完之后就清空数据,避免内存泄露
重写一个方法【afterCompletion】:
里面调用TreadLocalUtil提供的清楚即可
4.在service中去导入拦截器下的对象
注意点是 “类型是Map对象”
5.测试结果
6.总结一下: