springboot+websocket+vue 服务端像前端推送消息
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了springboot+websocket+vue 服务端像前端推送消息,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6507字,纯文字阅读大概需要10分钟。
内容图文
最近项目中需要进行在线用户管理,故采用了websocket来实现消息推送至前端
pom依赖
<!-- WebSocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.1.0.RELEASE</version> </dependency>
后端
@Service public class UserOnlineInfoServiceImpl implements UserOnlineInfoService { @Autowired private UserDao userDao; @Autowired private RoleDao roleDao; @Autowired private UserOnlineInfoDao userOnlineInfoDao; /** * 根据条件查询 * @param userOnlineQuery * @return*/ @Override public List<UserOnlineInfoDTO> query(UserOnlineQuery userOnlineQuery) { try { UserOnlineInfo onlineInfo = new UserOnlineInfo(); if (userOnlineQuery != null) { if (StrUtil.isBlank(userOnlineQuery.getName())) { userOnlineQuery.setName(null); } if (StrUtil.isBlank(userOnlineQuery.getCode())) { userOnlineQuery.setCode(null); } BeanUtils.copyProperties(userOnlineQuery, onlineInfo); } List<UserOnlineInfo> onlineInfos = userOnlineInfoDao.queryByCondition(onlineInfo); List<UserOnlineInfoDTO> onlineInfoDTOs = new ArrayList<>(onlineInfos.size()); onlineInfos.forEach(info -> { UserOnlineInfoDTO infoDTO = new UserOnlineInfoDTO(); BeanUtils.copyProperties(info, infoDTO); onlineInfoDTOs.add(infoDTO); }); return onlineInfoDTOs; } catch (Exception e) { thrownew ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_QUERY_FALSE, e); } } /** * 类型转换 * * @Param: [dto] * @Return: com.boss.bes.user.permission.dao.entity.UserOnlineInfoPo * @Date: 2020/9/2 15:27 */public UserOnlineInfo doObjectTransfer(UserOnlineInfoDTO dto) { if (dto == null) { returnnull; } UserOnlineInfo userOnlineInfoPo = new UserOnlineInfo(); BeanUtil.copyProperties(dto, userOnlineInfoPo); return userOnlineInfoPo; } /** * 类型转换 * * @Param: [entity] * @Return: com.boss.bes.user.permission.pojo.dto.UserOnlineInfoDto * @Date: 2020/9/2 15:27 */public UserOnlineInfoDTO doObjectTransfer(UserOnlineInfo entity) { if (entity == null) { returnnull; } UserOnlineInfoDTO userOnlineInfoDto = new UserOnlineInfoDTO(); BeanUtil.copyProperties(entity, userOnlineInfoDto); return userOnlineInfoDto; } @Override public UserOnlineInfoDTO userLogin(UserOnlineInfoDTO userOnlineInfoDTO) { if (userOnlineInfoDTO == null || userOnlineInfoDTO.getUserId() == null) { returnnull; } try { User user = userDao.get(userOnlineInfoDTO.getUserId()); if (user == null) { returnnull; } UserOnlineInfo userOnlineInfo = new UserOnlineInfo(); userOnlineInfo.setUserId(user.getId()); userOnlineInfo.setCode(user.getCode()); userOnlineInfo.setName(user.getName()); userOnlineInfo.setIp(userOnlineInfoDTO.getIp()); userOnlineInfo.setOnlineTime(new Date()); userOnlineInfoDao.save(userOnlineInfo); BeanUtils.copyProperties(userOnlineInfo, userOnlineInfoDTO); return userOnlineInfoDTO; } catch (Exception e) { thrownew ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_LOGIN_FALSE, e); } } @Override public List<UserOnlineInfoDTO> forceUserLogout(List<UserOnlineInfoDTO> infoDTOs) { if (CollectionUtil.isEmpty(infoDTOs)) { returnnew ArrayList<>(); } //过滤重复的,或为null的用户id Set<Long> userIdSet = infoDTOs.stream() .filter(dto -> dto != null && dto.getUserId() != null) .map(UserOnlineInfoDTO::getUserId) .collect(Collectors.toSet()); try { if (CollectionUtil.isEmpty(userIdSet)) { returnnew ArrayList<>(); } //过滤非本公司或者本机构的用户 Set<Long> safeUserIdSet = roleDao.queryUserIdIn(userIdSet).stream() .map(BaseEntity::getId) .collect(Collectors.toSet()); if (CollectionUtil.isEmpty(safeUserIdSet)) { returnnew ArrayList<>(); } infoDTOs.removeIf(infoDTO -> !safeUserIdSet.contains(infoDTO.getUserId())); if (CollectionUtil.isEmpty(infoDTOs)) { returnnew ArrayList<>(); } List<UserOnlineInfo> infos = new ArrayList<>(infoDTOs.size()); Date currentDate = new Date(); infoDTOs.forEach(infoDTO -> { UserOnlineInfo onlineInfo = new UserOnlineInfo(); infoDTO.setOfflineTime(currentDate); //下线状态 infoDTO.setStatus((byte) 1); BeanUtils.copyProperties(infoDTO, onlineInfo); long duration = (currentDate.getTime() - infoDTO.getOnlineTime().getTime()) / (1000); onlineInfo.setStopTime((int) duration); infos.add(onlineInfo); }); userOnlineInfoDao.batchUpdate(infos); return infoDTOs; } catch (Exception e) { thrownew ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_LOGOUT_FALSE, e); } } @Override publicboolean userLogout(UserOnlineInfoDTO infoDTO) { if (infoDTO == null) { returnfalse; } try { infoDTO.setOfflineTime(new Date()); long duration = (infoDTO.getOfflineTime().getTime() - infoDTO.getOnlineTime().getTime()) / (1000); infoDTO.setStopTime((int) duration); //下线状态 infoDTO.setStatus((byte) 1); UserOnlineInfo onlineInfo = new UserOnlineInfo(); BeanUtils.copyProperties(infoDTO, onlineInfo); return userOnlineInfoDao.unsafeUpdate(onlineInfo) > 0; } catch (Exception e) { thrownew ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_LOGOUT_FALSE, e); } } }
前端
Vuex中在用户登录调用的方法中加入建立websocket的代码,在用户登录的时候就发送请求,与服务器进行连接,全程一直保持连接,接受服务器的信息。
// 与服务器建立连接 if (WebSocket) { const socket = new WebSocket(`${BASE_URL}/permission/websocket/${user.id}`) commit(‘SET_SOCKET‘, socket) socket.onopen = (e) => { heartCheck.start() } socket.onmessage = (e) => { console.log(e) try { const res = JSON.parse(e.data) if (res && res.body) { // 收到强制下线请求if (res.body === ‘logout‘) { if (state.socket) { const socket = state.socket commit(‘SET_SOCKET‘, null) socket.close() } MessageBox.confirm(‘你已经被管理员强制下线了‘, ‘强制下线通知‘, { confirmButtonText: ‘重新登录‘, cancelButtonText: ‘停留在此页‘, type: ‘warning‘ }).then(() => { // 登出 dispatch(‘logout‘).then(() => { location.reload() }) }).catch(() => { // 清除token信息 dispatch(‘resetToken‘).then(() => { }) }) } // 收到被顶下线请求if (res.body === ‘replaceLogout‘) { if (state.socket) { const socket = state.socket commit(‘SET_SOCKET‘, null) socket.close() } MessageBox.confirm(‘你已经其他地方登录‘, ‘强制下线通知‘, { confirmButtonText: ‘重新登录‘, cancelButtonText: ‘停留在此页‘, type: ‘warning‘ }).then(() => { // 登出 dispatch(‘logout‘).then(() => { location.reload() }) }).catch(() => { // 清除token信息 dispatch(‘resetToken‘).then(() => { }) }) } } } catch (err) { console.log(err) } } socket.onclose = (e) => { console.log(e) heartCheck.clear() dispatch(‘resetToken‘).then(() => {}) } socket.onerror = (e) => { console.log(e) Message({ message: ‘连接服务器失败‘, type: ‘error‘, duration: 5 * 1000 }) } }
原文:https://www.cnblogs.com/venb/p/13792086.html
内容总结
以上是互联网集市为您收集整理的springboot+websocket+vue 服务端像前端推送消息全部内容,希望文章能够帮你解决springboot+websocket+vue 服务端像前端推送消息所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。