65ff8a373c65ee30e9b35857b1f2f182efd9e774.svn-base 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package org.jeecg.modules.system.controller;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.Collections;
  5. import java.util.List;
  6. import javax.annotation.Resource;
  7. import org.apache.commons.lang.StringUtils;
  8. import org.apache.shiro.SecurityUtils;
  9. import org.jeecg.common.api.vo.Result;
  10. import org.jeecg.common.constant.CacheConstant;
  11. import org.jeecg.common.constant.CommonConstant;
  12. import org.jeecg.common.system.api.ISysBaseAPI;
  13. import org.jeecg.common.system.util.JwtUtil;
  14. import org.jeecg.common.system.vo.LoginUser;
  15. import org.jeecg.common.util.RedisUtil;
  16. import org.jeecg.common.util.oConvertUtils;
  17. import org.jeecg.modules.base.service.BaseCommonService;
  18. import org.jeecg.modules.system.service.ISysUserService;
  19. import org.jeecg.modules.system.vo.SysUserOnlineVO;
  20. import org.springframework.beans.BeanUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.data.redis.core.RedisTemplate;
  23. import org.springframework.web.bind.annotation.*;
  24. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  25. import lombok.extern.slf4j.Slf4j;
  26. /**
  27. * @Description: 在线用户
  28. * @Author: chenli
  29. * @Date: 2020-06-07
  30. * @Version: V1.0
  31. */
  32. @RestController
  33. @RequestMapping("/sys/online")
  34. @Slf4j
  35. public class SysUserOnlineController {
  36. @Autowired
  37. private RedisUtil redisUtil;
  38. @Autowired
  39. public RedisTemplate redisTemplate;
  40. @Autowired
  41. public ISysUserService userService;
  42. @Autowired
  43. private ISysBaseAPI sysBaseAPI;
  44. @Resource
  45. private BaseCommonService baseCommonService;
  46. @RequestMapping(value = "/list", method = RequestMethod.GET)
  47. public Result<Page<SysUserOnlineVO>> list(@RequestParam(name="username", required=false) String username, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
  48. @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
  49. Collection<String> keys = redisTemplate.keys(CommonConstant.PREFIX_USER_TOKEN + "*");
  50. SysUserOnlineVO online;
  51. List<SysUserOnlineVO> onlineList = new ArrayList<SysUserOnlineVO>();
  52. for (String key : keys) {
  53. online = new SysUserOnlineVO();
  54. String token = (String) redisUtil.get(key);
  55. if (!StringUtils.isEmpty(token)){
  56. online.setToken(token);
  57. LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token));
  58. BeanUtils.copyProperties(loginUser, online);
  59. if (StringUtils.isNotEmpty(username)) {
  60. if (StringUtils.equals(username, online.getUsername())) {
  61. onlineList.add(online);
  62. }
  63. } else {
  64. onlineList.add(online);
  65. }
  66. }
  67. }
  68. Page<SysUserOnlineVO> page = new Page<SysUserOnlineVO>(pageNo, pageSize);
  69. int count = onlineList.size();
  70. List<SysUserOnlineVO> pages = new ArrayList<>();
  71. //计算当前页第一条数据的下标
  72. int currId = pageNo>1 ? (pageNo-1)*pageSize:0;
  73. for (int i=0; i<pageSize && i<count - currId;i++){
  74. pages.add(onlineList.get(currId+i));
  75. }
  76. page.setSize(pageSize);
  77. page.setCurrent(pageNo);
  78. page.setTotal(count);
  79. //计算分页总页数
  80. page.setPages(count %10 == 0 ? count/10 :count/10+1);
  81. page.setRecords(pages);
  82. Collections.reverse(onlineList);
  83. onlineList.removeAll(Collections.singleton(null));
  84. Result<Page<SysUserOnlineVO>> result = new Result<Page<SysUserOnlineVO>>();
  85. result.setSuccess(true);
  86. result.setResult(page);
  87. return result;
  88. }
  89. /**
  90. * 强退用户
  91. */
  92. @RequestMapping(value = "/forceLogout",method = RequestMethod.POST)
  93. public Result<Object> forceLogout(@RequestBody SysUserOnlineVO online) {
  94. //用户退出逻辑
  95. if(oConvertUtils.isEmpty(online.getToken())) {
  96. return Result.error("退出登录失败!");
  97. }
  98. String username = JwtUtil.getUsername(online.getToken());
  99. LoginUser sysUser = sysBaseAPI.getUserByName(username);
  100. if(sysUser!=null) {
  101. baseCommonService.addLog("强制: "+sysUser.getRealname()+"退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser);
  102. log.info(" 强制 "+sysUser.getRealname()+"退出成功! ");
  103. //清空用户登录Token缓存
  104. redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + online.getToken());
  105. //清空用户登录Shiro权限缓存
  106. redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
  107. //清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
  108. redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
  109. //调用shiro的logout
  110. SecurityUtils.getSubject().logout();
  111. return Result.ok("退出登录成功!");
  112. }else {
  113. return Result.error("Token无效!");
  114. }
  115. }
  116. }