持续学习&持续更新中…
守破离
【Java从零到架构师第③季】【49】会话管理—Token_ehcache
- 基于Cookie、Session
- 基于Token
- ehcache
- 简单使用
- 项目使用:登录、登出
- 补充:简单的分布式架构介绍
- 参考
依赖:
org.ehcache ehcache
标签:
1000
使用:
java.lang.Object java.lang.Object 10000 7
public class Caches {
private static final CacheManager MGR;
private static final Cache
项目使用:登录、登出
- 只要近7天登录过,就不会失效,就不用重新登录
java.lang.Object java.lang.Object 10000 7 programmer.lp.jk.common.cache.TokenCacheListener ASYNCHRONOUS UNORDERED CREATED EXPIRED REMOVED
public class TokenCacheListener implements CacheEventListener{ @Override public void onEvent(CacheEvent cacheEvent) { String token = (String) cacheEvent.getKey(); switch (cacheEvent.getType()) { case CREATED: {// 添加了一个新的token(说明有一个用户刚登录) SysUserDto user = (SysUserDto) cacheEvent.getNewValue(); // 以便将来通过用户id找到他对应的token Caches.put(user.getUser().getId(), token); break; } case EXPIRED: case REMOVED: { // token被移除或者过期了 SysUserDto user = (SysUserDto) cacheEvent.getOldValue(); Caches.remove(user.getUser().getId()); break; } default: break; } } }
@Override
public RespLogin login(ReqLogin reqVo) {
// 根据用户名查询用户
MPLambdaQueryWrapper wrapper = new MPLambdaQueryWrapper<>();
wrapper.eq(SysUser::getUsername, reqVo.getUsername());
SysUser po = baseMapper.selectOne(wrapper);
// 用户名不存在
if (po == null) {
return JSONResults.exception(CodeMsg.WRONG_USERNAME);
}
// 密码不正确
if (!po.getPassword().equals(reqVo.getPassword())) {
return JSONResults.exception(CodeMsg.WRONG_PASSWORD);
}
// 账号锁定
if (po.getStatus() == Constants.SysUserStatus.LOCKED) {
return JSONResults.exception(CodeMsg.USER_LOCKED);
}
// 更新登录时间
po.setLoginTime(new Date());
baseMapper.updateById(po);
SysUserDto dto = new SysUserDto();
dto.setUser(po);
// 根据用户id查询所有的角色:sys_role,sys_user_role
List roles = roleService.listByUserId(po.getId());
// 根据角色id查询所有的资源:sys_resource、sys_role_resource
if (!CollectionUtils.isEmpty(roles)) {
dto.setRoles(roles);
List roleIds = Streams.map(roles, SysRole::getId);
List resources = resourceService.listByRoleIds(roleIds);
dto.setResources(resources);
}
// 生成Token,发送Token给用户
String token = UUID.randomUUID().toString();
// 存储token到缓存中
Caches.putToken(token, dto);
// 返回给客户端的具体数据
RespLogin vo = MapStruct.INSTANCE.po2loginVo(po);
vo.setToken(token);
return vo;
}
@PostMapping("/logout")
@ApiOperation("退出登录")
public JSONResult logout(@RequestHeader(TokenFilter.HEADER_TOKEN) String token) {
Caches.removeToken(token);
return JSONResults.ok(CodeMsg.LOGOUT_OK);
}
@Override
public boolean saveOrUpdate(ReqSaveSysUser entity) {
// 转成PO
SysUser po = MapStruct.INSTANCE.vo2po(entity);
// 保存用户信息
if (!saveOrUpdate(po)) return false;
Integer id = entity.getId();
if (id != null && id > 0) {// 如果是做更新
// 将更新成功的用户从缓存中移除(让token失效,用户必须重新登录)
Caches.removeToken(Caches.get(id));
// Caches.remove(id);
// 删除当前用户的所有角色信息
userRoleService.removeByUserId(entity.getId());
}
// 保存角色信息
String roleIdsStr = entity.getRoleIds();
if (Strings.isEmpty(roleIdsStr)) return true;
String[] roleIds = roleIdsStr.split(",");
List userRoles = new ArrayList<>();
Integer userId = po.getId();
for (String roleId : roleIds) { // 构建SysUserRole对象
SysUserRole userRole = new SysUserRole();
userRole.setUserId(userId);
userRole.setRoleId(Short.parseShort(roleId));
userRoles.add(userRole);
}
return userRoleService.saveBatch(userRoles);
}
// 角色信息被更新了也要让用户重新登录.
// 重新登录是为了去查用户的权限(资源),让其配合Shiro使用
@Override
public boolean saveOrUpdate(ReqSaveSysRole entity) {
// 转成PO
SysRole po = MapStruct.INSTANCE.vo2po(entity);
// 保存角色信息
if (!saveOrUpdate(po)) return false;
Short id = entity.getId();
if (id != null && id > 0) {
MPLambdaQueryWrapper wrapper = new MPLambdaQueryWrapper<>();
wrapper.select(SysUserRole::getUserId);
wrapper.eq(SysUserRole::getRoleId, id);
List userIds = userRoleMapper.selectObjs(wrapper);
if (!CollectionUtils.isEmpty(userIds)) {
for (Object userId : userIds) {
// 将拥有这个角色的用户从缓存中移除(让token失效,用户必须重新登录)
Caches.removeToken(Caches.get(userId));
}
}
// 删除当前角色的所有资源信息
roleResourceService.removeByRoleId(id);
}
// 保存角色信息
String resourceIdsStr = entity.getResourceIds();
if (Strings.isEmpty(resourceIdsStr)) return true;
String[] resourceIds = resourceIdsStr.split(",");
List roleResources = new ArrayList<>();
Short roleId = po.getId();
for (String resourceId : resourceIds) { // 构建SysUserRole对象
SysRoleResource roleResource = new SysRoleResource();
roleResource.setRoleId(roleId);
roleResource.setResourceId(Short.parseShort(resourceId));
roleResources.add(roleResource);
}
return roleResourceService.saveBatch(roleResources);
}
补充:简单的分布式架构介绍
参考
小码哥-李明杰: Java从0到架构师③进阶互联网架构师.
本文完,感谢您的关注支持!



