|
@@ -4,24 +4,22 @@ import java.io.IOException;
|
|
|
import java.io.OutputStream;
|
|
|
import java.util.ArrayDeque;
|
|
|
import java.util.Deque;
|
|
|
-import java.util.Objects;
|
|
|
import java.util.function.Function;
|
|
|
import javax.servlet.ServletRequestEvent;
|
|
|
import javax.servlet.ServletRequestListener;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
-import com.chelvc.framework.base.util.HttpUtils;
|
|
|
import com.chelvc.framework.common.model.Platform;
|
|
|
-import com.chelvc.framework.common.model.Result;
|
|
|
-import com.chelvc.framework.common.model.Session;
|
|
|
import com.chelvc.framework.common.model.Terminal;
|
|
|
import com.chelvc.framework.common.util.AssertUtils;
|
|
|
import com.chelvc.framework.common.util.ObjectUtils;
|
|
|
import com.chelvc.framework.common.util.StringUtils;
|
|
|
import com.fasterxml.jackson.core.JsonEncoding;
|
|
|
import lombok.NonNull;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
import org.springframework.http.MediaType;
|
|
|
import org.springframework.stereotype.Component;
|
|
@@ -36,12 +34,8 @@ import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
|
|
public class SessionContextHolder implements ServletRequestListener {
|
|
|
- /**
|
|
|
- * 会话上下文名称
|
|
|
- */
|
|
|
- public static final String NAME = "session";
|
|
|
-
|
|
|
/**
|
|
|
* 身份标识请求头
|
|
|
*/
|
|
@@ -87,21 +81,11 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
*/
|
|
|
public static final String HEADER_TIMESTAMP = "timestamp";
|
|
|
|
|
|
- /**
|
|
|
- * 签名信息请求头
|
|
|
- */
|
|
|
- public static final String HEADER_SIGNATURE = "signature";
|
|
|
-
|
|
|
/**
|
|
|
* 设备指纹请求头
|
|
|
*/
|
|
|
public static final String HEADER_FINGERPRINT = "fingerprint";
|
|
|
|
|
|
- /**
|
|
|
- * 认证信息请求头
|
|
|
- */
|
|
|
- public static final String HEADER_AUTHORIZATION = "authorization";
|
|
|
-
|
|
|
/**
|
|
|
* 空会话对象实例
|
|
|
*/
|
|
@@ -112,6 +96,8 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
*/
|
|
|
private static final ThreadLocal<Deque<Session>> SESSION_CONTEXT = ThreadLocal.withInitial(ArrayDeque::new);
|
|
|
|
|
|
+ private final SessionFactory sessionFactory;
|
|
|
+
|
|
|
/**
|
|
|
* 获取会话信息
|
|
|
*
|
|
@@ -148,26 +134,26 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 初始化会话信息
|
|
|
+ * 设置会话信息,如果当前已存在会话则更新会话主体信息
|
|
|
*
|
|
|
* @param id 主体标识
|
|
|
* @param scope 应用范围
|
|
|
* @param anonymous 是否匿名
|
|
|
* @return 会话信息
|
|
|
*/
|
|
|
- public static Session initializeSession(@NonNull Long id, @NonNull String scope, boolean anonymous) {
|
|
|
+ public static Session setSession(@NonNull Long id, @NonNull String scope, boolean anonymous) {
|
|
|
Deque<Session> deque = SESSION_CONTEXT.get();
|
|
|
- Session session, original = deque.poll();
|
|
|
- if (original == null || original == EMPTY_SESSION) {
|
|
|
+ Session session = deque.peek();
|
|
|
+ if (session == null || session == EMPTY_SESSION) {
|
|
|
+ if (session != null) {
|
|
|
+ deque.poll();
|
|
|
+ }
|
|
|
session = Session.builder().id(id).scope(scope).anonymous(anonymous)
|
|
|
.timestamp(System.currentTimeMillis()).build();
|
|
|
+ deque.push(session);
|
|
|
} else {
|
|
|
- session = Session.builder().id(id).scope(scope).anonymous(anonymous).host(original.getHost())
|
|
|
- .device(original.getDevice()).channel(original.getChannel()).platform(original.getPlatform())
|
|
|
- .terminal(original.getTerminal()).version(original.getVersion())
|
|
|
- .fingerprint(original.getFingerprint()).timestamp(original.getTimestamp()).build();
|
|
|
+ session.initializePrincipal(id, scope, anonymous);
|
|
|
}
|
|
|
- deque.push(session);
|
|
|
return session;
|
|
|
}
|
|
|
|
|
@@ -180,21 +166,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getId);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端身份标识
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 身份标识
|
|
|
- */
|
|
|
- public static Long getId(@NonNull HttpServletRequest request) {
|
|
|
- try {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_ID), Long::parseLong);
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("Id convert failed: {}", e.getMessage());
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前会话请求地址
|
|
|
*
|
|
@@ -204,16 +175,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getHost);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端主机地址
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 主机地址
|
|
|
- */
|
|
|
- public static String getHost(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(HttpUtils.getHost(request), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取应用范围
|
|
|
*
|
|
@@ -223,16 +184,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getScope);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取应用范围
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 应用范围
|
|
|
- */
|
|
|
- public static String getScope(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_SCOPE), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前会话设备标识
|
|
|
*
|
|
@@ -242,16 +193,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getDevice);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端设备标识
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 设备标识
|
|
|
- */
|
|
|
- public static String getDevice(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_DEVICE), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前会话渠道来源
|
|
|
*
|
|
@@ -261,16 +202,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getChannel);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端渠道来源
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 渠道来源
|
|
|
- */
|
|
|
- public static String getChannel(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_CHANNEL), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前会话平台信息
|
|
|
*
|
|
@@ -280,21 +211,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getPlatform);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端平台标识
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 平台标识
|
|
|
- */
|
|
|
- public static Platform getPlatform(@NonNull HttpServletRequest request) {
|
|
|
- try {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_PLATFORM), Platform::valueOf);
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("Platform convert failed: {}", e.getMessage());
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前会话终端信息
|
|
|
*
|
|
@@ -304,21 +220,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getTerminal);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端终端
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 终端标识
|
|
|
- */
|
|
|
- public static Terminal getTerminal(@NonNull HttpServletRequest request) {
|
|
|
- try {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_TERMINAL), Terminal::valueOf);
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("Terminal convert failed: {}", e.getMessage());
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前会话版本信息
|
|
|
*
|
|
@@ -328,16 +229,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getVersion);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取客户端版本号
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 版本号
|
|
|
- */
|
|
|
- public static String getVersion(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_VERSION), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 是否是匿名用户
|
|
|
*
|
|
@@ -348,17 +239,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return session == null || session.isAnonymous();
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 是否是匿名用户
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return true/false
|
|
|
- */
|
|
|
- public static boolean isAnonymous(@NonNull HttpServletRequest request) {
|
|
|
- String anonymous = request.getHeader(HEADER_ANONYMOUS);
|
|
|
- return StringUtils.isEmpty(anonymous) || Objects.equals(anonymous, StringUtils.TRUE);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取请求时间戳
|
|
|
*
|
|
@@ -368,40 +248,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getTimestamp);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取请求时间戳
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 时间戳
|
|
|
- */
|
|
|
- public static Long getTimestamp(@NonNull HttpServletRequest request) {
|
|
|
- try {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_TIMESTAMP), Long::parseLong);
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("Timestamp convert failed: {}", e.getMessage());
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取签名信息
|
|
|
- *
|
|
|
- * @return 签名信息
|
|
|
- */
|
|
|
- public static String getSignature() {
|
|
|
- return ObjectUtils.ifNull(getRequest(), SessionContextHolder::getSignature, () -> null);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取签名信息
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 签名信息
|
|
|
- */
|
|
|
- public static String getSignature(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_SIGNATURE), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取设备指纹
|
|
|
*
|
|
@@ -411,36 +257,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
return ObjectUtils.ifNull(getSession(false), Session::getFingerprint);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取设备指纹
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 设备指纹
|
|
|
- */
|
|
|
- public static String getFingerprint(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_FINGERPRINT), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取认证信息
|
|
|
- *
|
|
|
- * @return 认证信息
|
|
|
- */
|
|
|
- public static String getAuthorization() {
|
|
|
- HttpServletRequest request = getRequest();
|
|
|
- return request == null ? null : getAuthorization(request);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取认证信息
|
|
|
- *
|
|
|
- * @param request Http请求对象
|
|
|
- * @return 认证信息
|
|
|
- */
|
|
|
- public static String getAuthorization(@NonNull HttpServletRequest request) {
|
|
|
- return StringUtils.ifEmpty(request.getHeader(HEADER_AUTHORIZATION), (String) null);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取当前请求对象
|
|
|
*
|
|
@@ -576,7 +392,6 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
output.flush();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 清空上下文信息
|
|
|
*/
|
|
@@ -590,12 +405,7 @@ public class SessionContextHolder implements ServletRequestListener {
|
|
|
|
|
|
@Override
|
|
|
public void requestInitialized(ServletRequestEvent event) {
|
|
|
- HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
|
|
|
- Session session = Session.builder().id(getId(request)).host(getHost(request)).scope(getScope(request))
|
|
|
- .device(getDevice(request)).channel(getChannel(request)).platform(getPlatform(request))
|
|
|
- .terminal(getTerminal(request)).version(getVersion(request)).fingerprint(getFingerprint(request))
|
|
|
- .anonymous(isAnonymous(request)).timestamp(getTimestamp(request)).build();
|
|
|
- setSession(session);
|
|
|
+ setSession(this.sessionFactory.build((HttpServletRequest) event.getServletRequest()));
|
|
|
}
|
|
|
|
|
|
@Override
|