ThreadLocal:
- 线程局部变量,本质是一个Map集合,用于对象存储
- 线程之内 信息共享
- 线程之间 信息隔离
ThreadLocal3个方法:
- set(T value) :设置当前线程绑定的变量
- get():获取当前线程绑定的变量
- remove() :移除当前线程绑定的变量
ThreadLocal可以配合Spring拦截器一起使用
Spring拦截器三个方法:
- preHandle() : 在目标方法之前执行,一般用于预处理
- postHandle():在目标方法执行之后执行,一般用于后处理
- afterCompletion():整个请求处理完毕,在视图渲染完毕时回调,一般用于资源的清理或性能的统计
ThreadLocal与Spring拦截器实现思路:
代码实现:
1、在
reggie-common
下创建com.itheima.reggie.common.EmployeeHolder
package com.itheima.reggie.config;
import com.itheima.reggie.domain.Employee;
//ThreadLocal操作工具类
public class EmployeeHolder {
//维护ThreadLocal对象
private static ThreadLocal<Employee> threadLocal = new ThreadLocal<>();
//放入User
public static void set(Employee employee) {
threadLocal.set(employee);
}
//获取User
public static Employee get() {
return threadLocal.get();
}
//移除User
public static void remove() {
threadLocal.remove();
}
}
2、修改
com.itheima.reggie.interceptor.LoginCheckInterceptor
//登录拦截器
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1、判断登录状态,如果已登录,则直接放行
Employee employee = (Employee) request.getSession().getAttribute(Constant.SESSION_EMPLOYEE);
if (employee != null) {
//将employ方法ThreadLocal
EmployeeHolder.set(employee);
return true;
}
//2、如果未登录,禁止通行,返回错误
String json = JSON.toJSONString(ResultInfo.error("NOTLOGIN"));
response.getWriter().write(json);
return false;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
EmployeeHolder.remove();
}
}
3、修改
com.itheima.reggie.config.MyMetaObjectHandler
//自定义元数据对象处理器
//自动填充逻辑
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入操作,自动填充
@Override
public void insertFill(MetaObject metaObject) {
metaObject.setValue("createTime", new Date());
metaObject.setValue("updateTime", new Date());
// 从ThreadLocal中获取Employee的对象
Employee employee = EmployeeHolder.get();
if (employee != null) {
metaObject.setValue("createUser", employee.getId());
metaObject.setValue("updateUser", employee.getId());
}
}
//更新操作,自动填充
@Override
public void updateFill(MetaObject metaObject) {
metaObject.setValue("updateTime", new Date());
Employee employee = EmployeeHolder.get();
if (employee != null) {
metaObject.setValue("updateUser", employee.getId());
}
}
}