项目中session未获取到
作者:互联网
由于需要用到session时,每次都需要用到 HttpServletRequest request的这些内容
employee.setCreateTime(LocalDateTime.now());
employee.setUpdateTime(LocalDateTime.now());
Long empId = (Long) request.getSession().getAttribute("employee");
employee.setCreateUser(empId);
employee.setUpdateUser(empId);
所以可以把它们抽取出来,用MybatisPlus在entity层里的这个注解类(这些公共类很多实体层都有)
//创建时间
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
//更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
//创建人
@TableField(fill = FieldFill.INSERT)
private Long createUser;
//修改人
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
方法可以这么写
1、可以创建一个common包,在这个包里面创建BaseContext这个类,通过每次启动的线程获取对应的id
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* 设置值
* @param id
*/
public static void setCurrentId(Long id){
threadLocal.set(id);
}
/**
* 获取值
* @return
*/
public static Long getCurrentId(){
return threadLocal.get();
}
然后再comon包里创建 MyMetaObjecthandler 需要实现这个接口MetaObjectHandler
/**
* 插入操作,自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now()); //设置创建时间
metaObject.setValue("updateTime",LocalDateTime.now()); //设置修改时间
metaObject.setValue("createUser",BaseContext.getCurrentId()); //设置创建用户
metaObject.setValue("updateUser",BaseContext.getCurrentId()); //设置修改用户
}
/**
* 更新操作,自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]...");
log.info(metaObject.toString());
long id = Thread.currentThread().getId(); //通过线程获取到对应的id
log.info("线程id为:{}",id);
metaObject.setValue("updateTime",LocalDateTime.now()); //设置更新的时间
metaObject.setValue("updateUser",BaseContext.getCurrentId()); //设置通过session获取到的用户id
}
我用了这个方法后,区别于之前的通过 request.getSession().getAttribute("自己取的session名")
出现了一个问题,通过F12和Debug调试发现createUser和UpdateUser的值为空,最后通过排查发现在登录拦截器LoginCheckFilter的这两行通过Session获取对象内容没给加到BaseContest.setCurrentId上。
//判断登录状态,如果已登录,则直接放行
if(request.getSession().getAttribute("employee") != null){
log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
//刚开始增加修改的时候update_user=null 原因是在这边没有设置session的对象传到BaseContest.setCurrentId上
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
//上面这两行忘了写
filterChain.doFilter(request,response);
return;
}
就此问题已解决!
标签:metaObject,项目,request,Long,获取,session,LocalDateTime,employee,id 来源: https://www.cnblogs.com/LinksY/p/16421819.html