其他分享
首页 > 其他分享> > 项目中session未获取到

项目中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