socket小改

个人中心的历史记录只查询7天内的
master
toesbieya 6 years ago
parent f323fc3546
commit d7ecc39564
  1. 22
      java/src/main/java/com/toesbieya/my/config/HttpSessionConfig.java
  2. 1
      java/src/main/java/com/toesbieya/my/config/SocketConfig.java
  3. 12
      java/src/main/java/com/toesbieya/my/controller/SysUserController.java
  4. 24
      java/src/main/java/com/toesbieya/my/listener/RedisSessionListener.java
  5. 3
      java/src/main/java/com/toesbieya/my/mapper/RecLoginHistoryMapper.java
  6. 2
      java/src/main/java/com/toesbieya/my/model/vo/search/LoginHistorySearch.java
  7. 2
      java/src/main/java/com/toesbieya/my/model/vo/search/UserActionSearch.java
  8. 69
      java/src/main/java/com/toesbieya/my/module/SocketModule.java
  9. 6
      java/src/main/resources/mapping/RecLoginHistory.xml

@ -1,23 +1,37 @@
package com.toesbieya.my.config;
import com.alibaba.fastjson.JSON;
import com.toesbieya.my.listener.RedisSessionListener;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.module.SocketModule;
import com.toesbieya.my.utils.Util;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@Configuration
@EnableRedisHttpSession()
public class HttpSessionConfig {
@Bean
public RedisSessionListener httpSessionEventPublisher() {
return new RedisSessionListener();
public HttpSessionListener httpSessionEventPublisher() {
return new HttpSessionListener() {
@Override
public void sessionCreated(HttpSessionEvent se) { }
@Override
public void sessionDestroyed(HttpSessionEvent se) {
SysUser user = Util.getUser(se.getSession());
if (user != null) {
SocketModule.logout(user.getId(), "登陆状态过期,请重新登陆");
}
}
};
}
@Bean("springSessionDefaultRedisSerializer")

@ -16,6 +16,7 @@ public class SocketConfig {
config.setPort(SocketConstant.PORT);
config.setMaxFramePayloadLength(SocketConstant.MAX_FRAME_PAYLOAD);
config.setMaxHttpContentLength(SocketConstant.MAX_HTTP_CONTENT);
config.setAddVersionHeader(false);
return new SocketIOServer(config);
}

@ -42,10 +42,8 @@ public class SysUserController {
public Result getLoginHistory(@RequestBody LoginHistorySearch vo) {
SysUser user = Util.getUser(session);
assert user != null;
if (!user.getAdmin().equals(1)) {
vo.setStartTime(null);
vo.setEndTime(DateUtil.getTimestampBeforeNow(-7));
}
vo.setUid(user.getId());
vo.setStartTime(DateUtil.getTimestampBeforeNow(7));
return Result.success(recService.searchLoginHistory(vo));
}
@ -53,10 +51,8 @@ public class SysUserController {
public Result getUserAction(@RequestBody UserActionSearch vo) {
SysUser user = Util.getUser(session);
assert user != null;
if (user.getAdmin() != 1) {
vo.setStartTime(null);
vo.setEndTime(DateUtil.getTimestampBeforeNow(-7));
}
vo.setUid(user.getId());
vo.setStartTime(DateUtil.getTimestampBeforeNow(7));
return Result.success(recService.searchUserAction(vo));
}

@ -1,24 +0,0 @@
package com.toesbieya.my.listener;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.module.SocketModule;
import com.toesbieya.my.utils.Util;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class RedisSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
SysUser sysUser = Util.getUser(se.getSession());
if (sysUser != null) {
SocketModule.logout(sysUser.getId(), "登陆状态过期,请重新登陆");
}
}
}

@ -2,7 +2,6 @@ package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.RecLoginHistory;
import com.toesbieya.my.model.vo.search.LoginHistorySearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -10,6 +9,4 @@ public interface RecLoginHistoryMapper {
int insert(RecLoginHistory history);
List<RecLoginHistory> search(LoginHistorySearch vo);
List<RecLoginHistory> getByUid(@Param("uid") Integer uid);
}

@ -8,7 +8,7 @@ import lombok.ToString;
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class LoginHistorySearch extends BaseSearch {
private String uid;
private Integer uid;
private String uname;
private Integer type;
private String ip;

@ -8,7 +8,7 @@ import lombok.ToString;
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class UserActionSearch extends BaseSearch {
private String uid;
private Integer uid;
private String uname;
private String ip;
private String url;

@ -14,29 +14,31 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Slf4j
public class SocketModule {
private static ConcurrentHashMap<Integer, UserClient> socketMap = new ConcurrentHashMap<>(SessionConstant.PREDICT_MAX_USER);
private final SocketIOServer server;
private static final ConcurrentHashMap<Integer, UserObject> socketMap = new ConcurrentHashMap<>(SessionConstant.PREDICT_MAX_USER);
private static SocketIOServer server;
@Autowired
public SocketModule(SocketIOServer server) {
this.server = server;
SocketModule.server = server;
server.start();
}
public static void logout(Integer uid, String msg) {
UserClient client = socketMap.get(uid);
UserObject obj = socketMap.get(uid);
if (obj == null) return;
SocketIOClient client = server.getClient(obj.getUuid());
if (client == null) return;
client.getClient().sendEvent(SocketConstant.EVENT_LOGOUT, msg);
RedisUtil.expire(SessionConstant.REDIS_NAMESPACE + client.getSessionID());
client.getClient().disconnect();
client = null;
client.sendEvent(SocketConstant.EVENT_LOGOUT, msg);
RedisUtil.expire(SessionConstant.REDIS_NAMESPACE + obj.getSessionID());
client.disconnect();
socketMap.remove(uid);
}
@ -44,27 +46,23 @@ public class SocketModule {
return uid != null && socketMap.containsKey(uid);
}
@PostConstruct
public void init() {
server.start();
}
@OnConnect
public void onConnect(SocketIOClient client) {
UserClient userClient = new UserClient(client);
int uid = userClient.getUid();
if (socketMap.get(uid) != null) logout(uid, "该账号在其他位置登录");
socketMap.put(uid, userClient);
UserObject obj = new UserObject(client);
Integer uid = obj.getUid();
if (socketMap.containsKey(uid)) logout(uid, "该账号在其他位置登录");
else socketMap.put(uid, obj);
}
@OnDisconnect
public void onDisconnect(SocketIOClient client) {
UserClient userClient = new UserClient(client);
UserClient already = socketMap.get(userClient.getUid());
UserObject obj = new UserObject(client);
Integer uid = obj.getUid();
UserObject already = socketMap.get(uid);
if (already == null) return;
//只有sessionID相同时才移除
if (userClient.getSessionID().equals(already.getSessionID())) {
socketMap.remove(userClient.getUid());
if (obj.getSessionID().equals(already.getSessionID())) {
socketMap.remove(uid);
}
}
@ -83,32 +81,19 @@ public class SocketModule {
return sa.substring(1, sa.indexOf(":"));
}
private int getUidFromIOClient(SocketIOClient client) {
Map<String, List<String>> params = client.getHandshakeData().getUrlParams();
List<String> list = params.get("id");
if (list != null && list.size() > 0) {
return Integer.parseInt(list.get(0));
}
return -1;
}
@Data
private static class UserClient {
private Integer uid;
private String sessionID;
private SocketIOClient client;
private static class UserObject {
private Integer uid;//用户id
private String sessionID;//redis中的sessionID
private UUID uuid;//socketClient自己的sessionID
public UserClient(SocketIOClient client) {
public UserObject(SocketIOClient client) {
Map<String, List<String>> params = client.getHandshakeData().getUrlParams();
List<String> list = params.get("id");
if (list != null && list.size() > 0) {
this.uid = Integer.parseInt(list.get(0));
}
this.uid = Integer.valueOf(list.get(0));
list = params.get("session_id");
if (list != null && list.size() > 0) {
this.sessionID = list.get(0);
}
this.client = client;
this.uuid = client.getSessionId();
}
}
}

@ -10,12 +10,6 @@
<if test="startTime!=null">and time <![CDATA[ >= ]]> #{startTime}</if>
<if test="endTime!=null">and time <![CDATA[ <= ]]> #{endTime}</if>
</sql>
<select id="getByUid" resultType="com.toesbieya.my.model.entity.RecLoginHistory">
select *
from rec_login_history
where uid = #{uid}
order by time desc
</select>
<select id="search" resultType="com.toesbieya.my.model.entity.RecLoginHistory"
parameterType="com.toesbieya.my.model.vo.search.LoginHistorySearch">
select *

Loading…
Cancel
Save