springboot+websocket+vue服务端向前端推送消息最近项⽬中需要进⾏在线⽤户管理,故采⽤了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.Name())) {
userOnlineQuery.setName(null);
}
if (StrUtil.Code())) {
userOnlineQuery.setCode(null);
}
}
List<UserOnlineInfo> onlineInfos = userOnlineInfoDao.queryByCondition(onlineInfo);
List<UserOnlineInfoDTO> onlineInfoDTOs = new ArrayList<>(onlineInfos.size());
onlineInfos.forEach(info -> {
UserOnlineInfoDTO infoDTO = new UserOnlineInfoDTO();
onlineInfoDTOs.add(infoDTO);
});
return onlineInfoDTOs;
} catch (Exception e) {
throw new ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_QUERY_FALSE, e);
}
}
/**
* 类型转换
*
* @Param: [dto]
* @Return: com.boss.bes.user.ity.UserOnlineInfoPo
* @Date: 2020/9/2 15:27
*/
public UserOnlineInfo doObjectTransfer(UserOnlineInfoDTO dto) {
if (dto == null) {
return null;
}
UserOnlineInfo userOnlineInfoPo = new UserOnlineInfo();
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) {
return null;
}
UserOnlineInfoDTO userOnlineInfoDto = new UserOnlineInfoDTO();
return userOnlineInfoDto;
}
@Override
public UserOnlineInfoDTO userLogin(UserOnlineInfoDTO userOnlineInfoDTO) {
if (userOnlineInfoDTO == null || UserId() == null) {
return null;
}
try {
User user = (UserId());
if (user == null) {
return null;
}
UserOnlineInfo userOnlineInfo = new UserOnlineInfo();
userOnlineInfo.Id());
userOnlineInfo.Code());
userOnlineInfo.Name());
userOnlineInfo.Ip());
userOnlineInfo.setOnlineTime(new Date());
userOnlineInfoDao.save(userOnlineInfo);
return userOnlineInfoDTO;
} catch (Exception e) {
throw new ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_LOGIN_FALSE, e);        }
}
@Override
public List<UserOnlineInfoDTO> forceUserLogout(List<UserOnlineInfoDTO> infoDTOs) {
if (CollectionUtil.isEmpty(infoDTOs)) {
return new ArrayList<>();
}
//过滤重复的,或为null的⽤户id
Set<Long> userIdSet = infoDTOs.stream()
.filter(dto -> dto != null && UserId() != null)
.map(UserOnlineInfoDTO::getUserId)
.Set());
try {
if (CollectionUtil.isEmpty(userIdSet)) {
return new ArrayList<>();
}
//过滤⾮本公司或者本机构的⽤户
Set<Long> safeUserIdSet = roleDao.queryUserIdIn(userIdSet).stream()
.map(BaseEntity::getId)
.Set());
if (CollectionUtil.isEmpty(safeUserIdSet)) {
return new ArrayList<>();
}
if (CollectionUtil.isEmpty(infoDTOs)) {
return new 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);
long duration = (Time() - OnlineTime().getTime()) / (1000);
onlineInfo.setStopTime((int) duration);
infos.add(onlineInfo);
});
userOnlineInfoDao.batchUpdate(infos);
return infoDTOs;
} catch (Exception e) {
throw new ServiceException(SystemManageExceptionEnum.ONLINEUSER_MANAGE_LOGOUT_FALSE, e);        }
}
@Override
public boolean userLogout(UserOnlineInfoDTO infoDTO) {
if (infoDTO == null) {
return false;
}
try {
infoDTO.setOfflineTime(new Date());
long duration = (OfflineTime().getTime() - OnlineTime().getTime()) / (1000);
infoDTO.setStopTime((int) duration);
//下线状态
infoDTO.setStatus((byte) 1);
UserOnlineInfo onlineInfo = new UserOnlineInfo();
return userOnlineInfoDao.unsafeUpdate(onlineInfo) > 0;
} catch (Exception e) {
throw new 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)
heartCheck.start()
}
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()
}
confirmButtonText: '重新登录',
cancelButtonText: '停留在此页',
type: 'warning'
}).then(() => {
/
/ 登出
dispatch('logout').then(() => {
})
}).catch(() => {
// 清除token信息
dispatch('resetToken').then(() => {
})
})
}
// 收到被顶下线请求
if (res.body === 'replaceLogout') {
if (state.socket) {
const socket = state.socket
commit('SET_SOCKET', null)
socket.close()
}
前端websocket怎么用
confirmButtonText: '重新登录',
cancelButtonText: '停留在此页',
type: 'warning'
}).then(() => {
/
/ 登出
dispatch('logout').then(() => {
})
}).catch(() => {
// 清除token信息
dispatch('resetToken').then(() => {
})
})
}
}
} catch (err) {
console.log(err)
}
}
console.log(e)
heartCheck.clear()
dispatch('resetToken').then(() => {})
}
console.log(e)
Message({
message: '连接服务器失败',                type: 'error',
duration: 5 * 1000
})
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。