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"); } }