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. 71
      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; package com.toesbieya.my.config;
import com.alibaba.fastjson.JSON; 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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException; import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; 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.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@Configuration @Configuration
@EnableRedisHttpSession() @EnableRedisHttpSession()
public class HttpSessionConfig { public class HttpSessionConfig {
@Bean @Bean
public RedisSessionListener httpSessionEventPublisher() { public HttpSessionListener httpSessionEventPublisher() {
return new RedisSessionListener(); 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") @Bean("springSessionDefaultRedisSerializer")

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

@ -42,10 +42,8 @@ public class SysUserController {
public Result getLoginHistory(@RequestBody LoginHistorySearch vo) { public Result getLoginHistory(@RequestBody LoginHistorySearch vo) {
SysUser user = Util.getUser(session); SysUser user = Util.getUser(session);
assert user != null; assert user != null;
if (!user.getAdmin().equals(1)) { vo.setUid(user.getId());
vo.setStartTime(null); vo.setStartTime(DateUtil.getTimestampBeforeNow(7));
vo.setEndTime(DateUtil.getTimestampBeforeNow(-7));
}
return Result.success(recService.searchLoginHistory(vo)); return Result.success(recService.searchLoginHistory(vo));
} }
@ -53,10 +51,8 @@ public class SysUserController {
public Result getUserAction(@RequestBody UserActionSearch vo) { public Result getUserAction(@RequestBody UserActionSearch vo) {
SysUser user = Util.getUser(session); SysUser user = Util.getUser(session);
assert user != null; assert user != null;
if (user.getAdmin() != 1) { vo.setUid(user.getId());
vo.setStartTime(null); vo.setStartTime(DateUtil.getTimestampBeforeNow(7));
vo.setEndTime(DateUtil.getTimestampBeforeNow(-7));
}
return Result.success(recService.searchUserAction(vo)); 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.entity.RecLoginHistory;
import com.toesbieya.my.model.vo.search.LoginHistorySearch; import com.toesbieya.my.model.vo.search.LoginHistorySearch;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -10,6 +9,4 @@ public interface RecLoginHistoryMapper {
int insert(RecLoginHistory history); int insert(RecLoginHistory history);
List<RecLoginHistory> search(LoginHistorySearch vo); List<RecLoginHistory> search(LoginHistorySearch vo);
List<RecLoginHistory> getByUid(@Param("uid") Integer uid);
} }

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

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

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

@ -10,12 +10,6 @@
<if test="startTime!=null">and time <![CDATA[ >= ]]> #{startTime}</if> <if test="startTime!=null">and time <![CDATA[ >= ]]> #{startTime}</if>
<if test="endTime!=null">and time <![CDATA[ <= ]]> #{endTime}</if> <if test="endTime!=null">and time <![CDATA[ <= ]]> #{endTime}</if>
</sql> </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" <select id="search" resultType="com.toesbieya.my.model.entity.RecLoginHistory"
parameterType="com.toesbieya.my.model.vo.search.LoginHistorySearch"> parameterType="com.toesbieya.my.model.vo.search.LoginHistorySearch">
select * select *

Loading…
Cancel
Save