Springboot 获取当前登录用户

在Springboot使用Redis缓存基础上编写

User类

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonView;

@Entity
@Table(name = "MFC_USER")
public class User extends CreatedTimeEntity implements Serializable {

    private static final long serialVersionUID = 1499996380665206081L;

    // 用户名
    @JsonView(ListView.class)
    @Column(length = 30, name = "user_name", unique = true)
    private String userName;

    // 手机号
    @JsonView(ListView.class)
    @Column(length = 30, name = "phone", unique = true)
    private String phone;
    @Column
    private String num;
    // 密码
    @JsonIgnore
    @Column(length = 50)
    private String password;

    // 随机字符串,加强密码用
    @JsonIgnore
    @Column(length = 36, nullable = false)
    private String salt;

    // 姓名
    @JsonView(ListView.class)
    @Column(length = 30, nullable = false)
    private String name;

    // 性别
    @JsonView(ListView.class)
    @Column(nullable = false)
    private Boolean sex;

    // 部门
    @JsonView(ListView.class)
    @ManyToOne(fetch = FetchType.EAGER)
    private Department department;

    // 卡面号
    @JsonView(ListView.class)
    @Column(length = 50)
    private String cardnumber;

    // 卡物理号
    @JsonView(ListView.class)
    @Column(length = 50)
    private String cardnumberwl;

    // 是否超级用户
    @JsonView(ListView.class)
    private Boolean superuser;

    // 是否授权
    @JsonView(ListView.class)
    private Boolean accredit;

    // 卡有效期
    @JsonView(ListView.class)
    @Column(length = 50)
    private String valid;

    // 属性集
    @JsonView(ListView.class)
    @Column(length = 50)
    private String property;

    // 备注
    @JsonView(ListView.class)
    @Column(length = 100)
    private String remark;

    // 类别 0代表员工 1代表外协
    @JsonView(ListView.class)
    @Column(length = 20, nullable = false)
    private String type;

    // 车站Id
    @JsonView(ListView.class)
    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinColumn(name = "user_middle_id")
    private List<UserStation>stationId;

    @JsonView({ UserDetailView.class, UserListView.class })
    @ManyToMany(cascade = CascadeType.REFRESH)
    @JoinTable(name = "MFC_USER_ROLE", joinColumns = {
            @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = {
                    @JoinColumn(name = "role_id", referencedColumnName = "id") })
    private List<Role> roles = new ArrayList<Role>();

    public User() {
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    public String getCardnumber() {
        return cardnumber;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public void setCardnumber(String cardnumber) {
        this.cardnumber = cardnumber;
    }

    public String getCardnumberwl() {
        return cardnumberwl;
    }

    public void setCardnumberwl(String cardnumberwl) {
        this.cardnumberwl = cardnumberwl;
    }

    public Boolean getSex() {
        return sex;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    public Boolean getSuperuser() {
        return superuser;
    }

    public void setSuperuser(Boolean superuser) {
        this.superuser = superuser;
    }

    public Boolean getAccredit() {
        return accredit;
    }

    public void setAccredit(Boolean accredit) {
        this.accredit = accredit;
    }

    public String getValid() {
        return valid;
    }

    public void setValid(String valid) {
        this.valid = valid;
    }

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public List<UserStation> getStationId() {
        return stationId;
    }

    public void setStationId(List<UserStation> stationId) {
        this.stationId = stationId;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}
 

Session类

import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonView;

public class Session {

    @JsonView(ListView.class)
    private String token = UUID.randomUUID().toString();
    
    @JsonView(ListView.class)
    private long lastModifiedTime = System.currentTimeMillis();
    
    @JsonView(ListView.class)
    private User user;
    
    @SuppressWarnings("unused")
    private Session(){
        
    }

    public Session(User user) {
        this.user = user;
    }
    
    @JsonIgnore
    public String getUserId(){
        if(null!=user){
            return user.getId();
        }else{
            return null;
        }
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public long getLastModifiedTime() {
        return lastModifiedTime;
    }

    public void setLastModifiedTime(long lastModifiedTime) {
        this.lastModifiedTime = lastModifiedTime;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
 

SessionService类

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class SessionService {

    public static final String EFFECTIVE_TIME = "com.gzydt.passport.exports.effectiveTime";
    public static final String REFRESHED_TIME = "com.gzydt.passport.exports.refreshedTime";
    private static final String PRE_SESSION_KEY = "session_";
    private static final String PRE_USER_KEY = "user_";

    private static final Logger log = LoggerFactory.getLogger(SessionService.class);

    @Autowired
    private JedisClient client;

    @Autowired
    private Environment env;

    private long effectiveTime = 1800000;
    private long refreshedTime = 300000;

    private boolean inited = false;

    private void init() {
        if (!inited) {
            inited = true;
            dealConfig();
        }
    }

    private void dealConfig() {
        // 处理启动配置项
        dealTime(env);
    }

    private void dealTime(Environment env) {
        dealEffectiveTime(env);
        dealRefreshedTime(env);
    }

    private void dealEffectiveTime(Environment env) {
        try {
            long _effectiveTime = Long.valueOf(env.getProperty(EFFECTIVE_TIME));
            effectiveTime = _effectiveTime <= 0 ? effectiveTime : _effectiveTime;
        } catch (NumberFormatException e) {
            // 什么也不做
        }
        log.debug(EFFECTIVE_TIME + ":" + effectiveTime);
    }

    private void dealRefreshedTime(Environment env) {
        try {
            long _refreshedTime = Long.valueOf(env.getProperty(REFRESHED_TIME));
            refreshedTime = _refreshedTime <= 0 ? refreshedTime : _refreshedTime;
        } catch (NumberFormatException e) {
            // 什么也不做
        }
        log.debug(REFRESHED_TIME + ":" + refreshedTime);
    }

    public long getEffectiveTime() {
        init();
        return effectiveTime;
    }

    public long getRefreshedTime() {
        init();
        return refreshedTime;
    }

    public Session getSession(String key) {
        key = dealSessionKey(key);
        Session session = JsonUtil.toBean(Session.class, client.get(key));
        if (null != session) {
            if (need2Refresh(session)) {
                session.setLastModifiedTime(System.currentTimeMillis());
                client.set(key, JsonUtil.toJson(UserDetailView.class, session), this.getEffectiveTime() / 1000);
                log.debug("刷新session【" + key + "】");
            } else {
                // 什么都不做
            }
            return session;
        } else {
            throw new SessionNotFoundException();
        }
    }
    
    public User getLoginUser(String key) {
        Session session = getSession(key);
        return session.getUser();
    }

    public boolean deleteSession(String key) {
        key = dealSessionKey(key);
        client.delete(key);
        log.debug("删除session【" + key + "】");
        return true;
    }

    public void addSession(Session session) {
        String key = dealSessionKey(session.getToken());
        log.debug("添加session【" + key + "】");
        client.set(key, JsonUtil.toJson(UserDetailView.class, session), this.getEffectiveTime() / 1000);
    }

    private boolean need2Refresh(Session session) {
        if (System.currentTimeMillis() > session.getLastModifiedTime() + this.getRefreshedTime()) {
            return true;
        } else {
            return false;
        }
    }

    private String dealSessionKey(String key) {
        if (null == key || "".equals(key)) {
            return "";
        } else {
            return PRE_SESSION_KEY + key;
        }
    }

    public static String getTokenFromRequest(HttpServletRequest request) {
        String token = getTokenFromQueryParam(request);
        return null == token ? getTokenFromCookie(request) : token;
    }

    private static String getTokenFromCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (Cookie cookie : cookies) {
                if (StaticFinalStringUtil.TOKEN_NAME.equals(cookie.getName())) {
                    return cookie.getValue();
                }
            }
        }
        return null;
    }

    private static String getTokenFromQueryParam(HttpServletRequest request) {
        return request.getParameter(StaticFinalStringUtil.TOKEN_NAME);
    }

    public Session getSession(HttpServletRequest request) {
        String key = getTokenFromRequest(request);
        key = dealSessionKey(key);
        Session session = JsonUtil.toBean(Session.class, client.get(key));
        if (null != session) {
            if (need2Refresh(session)) {
                session.setLastModifiedTime(System.currentTimeMillis());
                client.set(key, JsonUtil.toJson(UserDetailView.class, session), this.getEffectiveTime() / 1000);
                log.debug("刷新session【" + key + "】");
            } else {
                // 什么都不做
            }
            return session;
        } else {
            throw new SessionNotFoundException();
        }
    }

    public User getLoginUser(HttpServletRequest request) {
        Session session = getSession(request);
        return session.getUser();
    }
    
    public void addUserUnion(String userId, String token) {
        client.set(dealUserKey(userId), token);
    }
    
    public String getUserUnion(String userId) {
        userId = dealUserKey(userId);
        return client.get(userId);
    }
    
    private String dealUserKey(String userId) {
        if (null == userId || "".equals(userId)) {
            return "";
        } else {
            return PRE_USER_KEY + userId;
        }
    }
}
 

登录类

private JsonResponse<?> _login(LoginForm form, HttpServletResponse response, HttpServletRequest request) {
        try {
            String checkCode = verificationCodeService.get(request);
            if (!CommonUtil.isEmtpy(checkCode) && checkCode.equalsIgnoreCase(form.getCheckCode())) {
                String key = userService.login(form.getAccount(), form.getPassword());
                this.setCookie(key, response);
                
                if (null == key) {
                    log.info("【" + form.getAccount() + "】登录失败!");
                    return new JsonResponse<>(400, "登录失败!");
                } else {
                    log.info("【" + form.getAccount() + "】登录成功!");
                    verificationCodeService.delete(request);// 删除验证码
                    LoginVo loginVo = new LoginVo(sessionService.getLoginUser(key), key);
                    dealLoginVo(loginVo);
                    return new JsonResponse<>(loginVo);
                }
            } else {
                log.info("【" + form.getCheckCode() + "】验证码错误!");
                return new JsonResponse<>(400, "验证码错误");
            }
        } catch (IllegalArgumentException | SessionNotFoundException e) {
            return new JsonResponse<>(400, e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponse<>(500, e.getMessage());
        }
    }

获取当前登录用户

public JsonResponse<Role> add(HttpServletRequest request) {
            User user = sessionService.getLoginUser(request);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponse<>(500, e.getMessage());
        }
    }

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值