package com.iailab.framework.web.core.util;
|
|
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.extra.servlet.ServletUtil;
|
import com.iailab.framework.common.enums.RpcConstants;
|
import com.iailab.framework.common.enums.TerminalEnum;
|
import com.iailab.framework.common.enums.UserTypeEnum;
|
import com.iailab.framework.common.pojo.CommonResult;
|
import com.iailab.framework.common.util.servlet.ServletUtils;
|
import com.iailab.framework.web.config.WebProperties;
|
import org.springframework.web.context.request.RequestAttributes;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import javax.servlet.ServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
|
/**
|
* 专属于 web 包的工具类
|
*
|
* @author iailab
|
*/
|
public class WebFrameworkUtils {
|
|
private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id";
|
private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type";
|
|
private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result";
|
|
public static final String HEADER_TENANT_ID = "tenant-id";
|
|
/**
|
* 终端的 Header
|
*
|
* @see com.iailab.framework.common.enums.TerminalEnum
|
*/
|
public static final String HEADER_TERMINAL = "terminal";
|
|
private static WebProperties properties;
|
|
public WebFrameworkUtils(WebProperties webProperties) {
|
WebFrameworkUtils.properties = webProperties;
|
}
|
|
/**
|
* 获得租户编号,从 header 中
|
* 考虑到其它 framework 组件也会使用到租户编号,所以不得不放在 WebFrameworkUtils 统一提供
|
*
|
* @param request 请求
|
* @return 租户编号
|
*/
|
public static Long getTenantId(HttpServletRequest request) {
|
String tenantId = request.getHeader(HEADER_TENANT_ID);
|
return NumberUtil.isNumber(tenantId) ? Long.valueOf(tenantId) : null;
|
}
|
|
public static void setLoginUserId(ServletRequest request, Long userId) {
|
request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId);
|
}
|
|
/**
|
* 设置用户类型
|
*
|
* @param request 请求
|
* @param userType 用户类型
|
*/
|
public static void setLoginUserType(ServletRequest request, Integer userType) {
|
request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType);
|
}
|
|
/**
|
* 获得当前用户的编号,从请求中
|
* 注意:该方法仅限于 framework 框架使用!!!
|
*
|
* @param request 请求
|
* @return 用户编号
|
*/
|
public static Long getLoginUserId(HttpServletRequest request) {
|
if (request == null) {
|
return null;
|
}
|
return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID);
|
}
|
|
/**
|
* 获得当前用户的类型
|
* 注意:该方法仅限于 web 相关的 framework 组件使用!!!
|
*
|
* @param request 请求
|
* @return 用户编号
|
*/
|
public static Integer getLoginUserType(HttpServletRequest request) {
|
if (request == null) {
|
return null;
|
}
|
// 1. 优先,从 Attribute 中获取
|
Integer userType = (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE);
|
if (userType != null) {
|
return userType;
|
}
|
// 2. 其次,基于 URL 前缀的约定
|
if (request.getServletPath().startsWith(properties.getAdminApi().getPrefix())) {
|
return UserTypeEnum.ADMIN.getValue();
|
}
|
if (request.getServletPath().startsWith(properties.getAppApi().getPrefix())) {
|
return UserTypeEnum.MEMBER.getValue();
|
}
|
return null;
|
}
|
|
public static Integer getLoginUserType() {
|
HttpServletRequest request = getRequest();
|
return getLoginUserType(request);
|
}
|
|
public static Long getLoginUserId() {
|
HttpServletRequest request = getRequest();
|
return getLoginUserId(request);
|
}
|
|
public static Integer getTerminal() {
|
HttpServletRequest request = getRequest();
|
if (request == null) {
|
return TerminalEnum.UNKNOWN.getTerminal();
|
}
|
String terminalValue = request.getHeader(HEADER_TERMINAL);
|
return NumberUtil.parseInt(terminalValue, TerminalEnum.UNKNOWN.getTerminal());
|
}
|
|
public static void setCommonResult(ServletRequest request, CommonResult<?> result) {
|
request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result);
|
}
|
|
public static CommonResult<?> getCommonResult(ServletRequest request) {
|
return (CommonResult<?>) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT);
|
}
|
|
public static HttpServletRequest getRequest() {
|
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
|
if (!(requestAttributes instanceof ServletRequestAttributes)) {
|
return null;
|
}
|
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
|
return servletRequestAttributes.getRequest();
|
}
|
|
/**
|
* 判断是否为 RPC 请求
|
*
|
* @param request 请求
|
* @return 是否为 RPC 请求
|
*/
|
public static boolean isRpcRequest(HttpServletRequest request) {
|
return request.getRequestURI().startsWith(RpcConstants.RPC_API_PREFIX);
|
}
|
|
/**
|
* 判断是否为 RPC 请求
|
*
|
* 约定大于配置,只要以 Api 结尾,都认为是 RPC 接口
|
*
|
* @param className 类名
|
* @return 是否为 RPC 请求
|
*/
|
public static boolean isRpcRequest(String className) {
|
return className.endsWith("Api");
|
}
|
|
}
|