|  |  |  | 
|---|
|  |  |  | import java.util.Map; | 
|---|
|  |  |  | import java.util.concurrent.TimeUnit; | 
|---|
|  |  |  | import javax.servlet.http.HttpServletRequest; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Value; | 
|---|
|  |  |  | import org.springframework.stereotype.Component; | 
|---|
|  |  |  | 
|---|
|  |  |  | * @author ruoyi | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Component | 
|---|
|  |  |  | public class TokenService | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public class TokenService { | 
|---|
|  |  |  | // 令牌自定义标识 | 
|---|
|  |  |  | @Value("${token.header}") | 
|---|
|  |  |  | private String header; | 
|---|
|  |  |  | 
|---|
|  |  |  | // 令牌有效期(默认30分钟) | 
|---|
|  |  |  | @Value("${token.expireTime}") | 
|---|
|  |  |  | private int expireTime; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 是否允许账户多终端同时登录(true允许 false不允许) | 
|---|
|  |  |  | @Value("${token.soloLogin}") | 
|---|
|  |  |  | private boolean soloLogin; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | protected static final long MILLIS_SECOND = 1000; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @return 用户信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public LoginUser getLoginUser(HttpServletRequest request) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public LoginUser getLoginUser(HttpServletRequest request) { | 
|---|
|  |  |  | // 获取请求携带的令牌 | 
|---|
|  |  |  | String token = getToken(request); | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(token)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(token)) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Claims claims = parseToken(token); | 
|---|
|  |  |  | // 解析对应的权限以及用户信息 | 
|---|
|  |  |  | String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); | 
|---|
|  |  |  | String userKey = getTokenKey(uuid); | 
|---|
|  |  |  | LoginUser user = redisCache.getCacheObject(userKey); | 
|---|
|  |  |  | return user; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | catch (Exception e) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 设置用户身份信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void setLoginUser(LoginUser loginUser) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public void setLoginUser(LoginUser loginUser) { | 
|---|
|  |  |  | if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { | 
|---|
|  |  |  | refreshToken(loginUser); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ///** | 
|---|
|  |  |  | // * 删除用户身份信息 | 
|---|
|  |  |  | // */ | 
|---|
|  |  |  | //public void delLoginUser(String token) | 
|---|
|  |  |  | //{ | 
|---|
|  |  |  | //    if (StringUtils.isNotEmpty(token)) | 
|---|
|  |  |  | //    { | 
|---|
|  |  |  | //        String userKey = getTokenKey(token); | 
|---|
|  |  |  | //        redisCache.deleteObject(userKey); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  | //} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 删除用户身份信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void delLoginUser(String token) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(token)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public void delLoginUser(String token, String userId) { | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(token)) { | 
|---|
|  |  |  | String userKey = getTokenKey(token); | 
|---|
|  |  |  | redisCache.deleteObject(userKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!soloLogin && StringUtils.isNotNull(userId)) { | 
|---|
|  |  |  | String userIdKey = getUserIdKey(userId); | 
|---|
|  |  |  | redisCache.deleteObject(userIdKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String getUserIdKey(String userId) { | 
|---|
|  |  |  | return Constants.LOGIN_USERID_KEY + userId; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param loginUser 用户信息 | 
|---|
|  |  |  | * @return 令牌 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public String createToken(LoginUser loginUser) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public String createToken(LoginUser loginUser) { | 
|---|
|  |  |  | String token = IdUtils.fastUUID(); | 
|---|
|  |  |  | loginUser.setToken(token); | 
|---|
|  |  |  | setUserAgent(loginUser); | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param loginUser | 
|---|
|  |  |  | * @return 令牌 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void verifyToken(LoginUser loginUser) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public void verifyToken(LoginUser loginUser) { | 
|---|
|  |  |  | long expireTime = loginUser.getExpireTime(); | 
|---|
|  |  |  | long currentTime = System.currentTimeMillis(); | 
|---|
|  |  |  | if (expireTime - currentTime <= MILLIS_MINUTE_TEN) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { | 
|---|
|  |  |  | refreshToken(loginUser); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ///** | 
|---|
|  |  |  | // * 刷新令牌有效期 | 
|---|
|  |  |  | // * | 
|---|
|  |  |  | // * @param loginUser 登录信息 | 
|---|
|  |  |  | // */ | 
|---|
|  |  |  | //public void refreshToken(LoginUser loginUser) | 
|---|
|  |  |  | //{ | 
|---|
|  |  |  | //    loginUser.setLoginTime(System.currentTimeMillis()); | 
|---|
|  |  |  | //    String appUserType = loginUser.getUser().getAppUserType(); | 
|---|
|  |  |  | //    if(StringUtils.isNull(appUserType)) | 
|---|
|  |  |  | //    { | 
|---|
|  |  |  | //        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); | 
|---|
|  |  |  | //        // 根据uuid将loginUser缓存 | 
|---|
|  |  |  | //        String userKey = getTokenKey(loginUser.getToken()); | 
|---|
|  |  |  | //        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  | //    else | 
|---|
|  |  |  | //    { | 
|---|
|  |  |  | //        loginUser.setExpireTime(loginUser.getLoginTime() + 365*24*60 * MILLIS_MINUTE); | 
|---|
|  |  |  | //        // 根据uuid将loginUser缓存 | 
|---|
|  |  |  | //        String userKey = getTokenKey(loginUser.getToken()); | 
|---|
|  |  |  | //        redisCache.setCacheObject(userKey, loginUser, 365*24*60, TimeUnit.MINUTES); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  | //} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 刷新令牌有效期 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param loginUser 登录信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void refreshToken(LoginUser loginUser) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public void refreshToken(LoginUser loginUser) { | 
|---|
|  |  |  | loginUser.setLoginTime(System.currentTimeMillis()); | 
|---|
|  |  |  | loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); | 
|---|
|  |  |  | // 根据uuid将loginUser缓存 | 
|---|
|  |  |  | //String userKey = getTokenKey(loginUser.getToken()); | 
|---|
|  |  |  | //redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); | 
|---|
|  |  |  | String appUserType = loginUser.getUser().getAppUserType(); | 
|---|
|  |  |  | if(StringUtils.isNull(appUserType)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (StringUtils.isNull(appUserType)) { | 
|---|
|  |  |  | loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); | 
|---|
|  |  |  | // 根据uuid将loginUser缓存 | 
|---|
|  |  |  | String userKey = getTokenKey(loginUser.getToken()); | 
|---|
|  |  |  | redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | loginUser.setExpireTime(loginUser.getLoginTime() + 365*24*60 * MILLIS_MINUTE); | 
|---|
|  |  |  | if (!soloLogin) { | 
|---|
|  |  |  | // 缓存用户唯一标识,防止同一帐号,同时登录 | 
|---|
|  |  |  | String userIdKey = getUserIdKey(loginUser.getUser().getUserId()); | 
|---|
|  |  |  | redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | loginUser.setExpireTime(loginUser.getLoginTime() + 365 * 24 * 60 * MILLIS_MINUTE); | 
|---|
|  |  |  | // 根据uuid将loginUser缓存 | 
|---|
|  |  |  | String userKey = getTokenKey(loginUser.getToken()); | 
|---|
|  |  |  | redisCache.setCacheObject(userKey, loginUser, 365*24*60, TimeUnit.MINUTES); | 
|---|
|  |  |  | redisCache.setCacheObject(userKey, loginUser, 365 * 24 * 60, TimeUnit.MINUTES); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param loginUser 登录信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void setUserAgent(LoginUser loginUser) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public void setUserAgent(LoginUser loginUser) { | 
|---|
|  |  |  | UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); | 
|---|
|  |  |  | String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); | 
|---|
|  |  |  | loginUser.setIpaddr(ip); | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param claims 数据声明 | 
|---|
|  |  |  | * @return 令牌 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private String createToken(Map<String, Object> claims) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | private String createToken(Map<String, Object> claims) { | 
|---|
|  |  |  | String token = Jwts.builder() | 
|---|
|  |  |  | .setClaims(claims) | 
|---|
|  |  |  | .signWith(SignatureAlgorithm.HS512, secret).compact(); | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param token 令牌 | 
|---|
|  |  |  | * @return 数据声明 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private Claims parseToken(String token) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | private Claims parseToken(String token) { | 
|---|
|  |  |  | return Jwts.parser() | 
|---|
|  |  |  | .setSigningKey(secret) | 
|---|
|  |  |  | .parseClaimsJws(token) | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param token 令牌 | 
|---|
|  |  |  | * @return 用户名 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public String getUsernameFromToken(String token) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public String getUsernameFromToken(String token) { | 
|---|
|  |  |  | Claims claims = parseToken(token); | 
|---|
|  |  |  | return claims.getSubject(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param request | 
|---|
|  |  |  | * @return token | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private String getToken(HttpServletRequest request) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | private String getToken(HttpServletRequest request) { | 
|---|
|  |  |  | String token = request.getHeader(header); | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { | 
|---|
|  |  |  | token = token.replace(Constants.TOKEN_PREFIX, ""); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return token; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String getTokenKey(String uuid) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | private String getTokenKey(String uuid) { | 
|---|
|  |  |  | return CacheConstants.LOGIN_TOKEN_KEY + uuid; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|