package com.oying.modules.security.service; import com.oying.modules.security.security.TokenProvider; import com.oying.modules.security.service.dto.JwtUserDto; import com.oying.utils.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import com.oying.modules.security.config.SecurityProperties; import com.oying.modules.security.service.dto.OnlineUserDto; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; /** * @author Z * @date 2019年10月26日21:56:27 */ @Service @Slf4j @AllArgsConstructor public class OnlineUserService { private final SecurityProperties properties; private final TokenProvider tokenProvider; private final RedisUtils redisUtils; /** * 保存在线用户信息 * @param jwtUserDto / * @param token / * @param request / */ public void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request){ String ip = StringUtils.getIp(request); String id = tokenProvider.getId(token); String browser = StringUtils.getBrowser(request); String address = StringUtils.getCityInfo(ip); OnlineUserDto onlineUserDto = null; try { onlineUserDto = new OnlineUserDto(id, jwtUserDto.getUsername(), jwtUserDto.getUser().getNickName(), browser , ip, address, EncryptUtils.desEncrypt(token), new Date()); } catch (Exception e) { log.error(e.getMessage(),e); } String loginKey = tokenProvider.loginKey(token); redisUtils.set(loginKey, onlineUserDto, properties.getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); } /** * 查询全部数据 * @param username / * @param pageable / * @return / */ public PageResult getAll(String username, Pageable pageable){ List onlineUserDtos = getAll(username); int pageNumber = pageable.getPageNumber() - 1; return PageUtil.toPage( PageUtil.paging(pageNumber,pageable.getPageSize(), onlineUserDtos), onlineUserDtos.size() ); } /** * 查询全部数据,不分页 * @param username / * @return / */ public List getAll(String username){ String loginKey = properties.getOnlineKey() + (StringUtils.isBlank(username) ? "" : "*" + username); List keys = redisUtils.scan(loginKey + "*"); Collections.reverse(keys); List onlineUserDtos = new ArrayList<>(); for (String key : keys) { onlineUserDtos.add(redisUtils.get(key, OnlineUserDto.class)); } onlineUserDtos.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); return onlineUserDtos; } /** * 退出登录 * @param token / */ public void logout(String token) { String loginKey = tokenProvider.loginKey(token); redisUtils.del(loginKey); } /** * 导出 * @param all / * @param response / * @throws IOException / */ public void download(List all, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); for (OnlineUserDto user : all) { Map map = new LinkedHashMap<>(); map.put("用户名", user.getUserName()); map.put("登录IP", user.getIp()); map.put("登录地点", user.getAddress()); map.put("浏览器", user.getBrowser()); map.put("登录日期", user.getLoginTime()); list.add(map); } FileUtil.downloadExcel(list, response); } /** * 查询用户 * @param key / * @return / */ public OnlineUserDto getOne(String key) { return redisUtils.get(key, OnlineUserDto.class); } /** * 根据用户名强退用户 * @param username / */ public void kickOutForUsername(String username) { String loginKey = properties.getOnlineKey() + username + "*"; redisUtils.scanDel(loginKey); } }