package cc.mrbird.febs.common.core.utils; import cc.mrbird.febs.common.core.entity.CurrentUser; import cc.mrbird.febs.common.core.entity.FebsAuthUser; import cc.mrbird.febs.common.core.entity.constant.PageConstant; import cc.mrbird.febs.common.core.entity.constant.RegexpConstant; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.core.env.Environment; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import reactor.core.publisher.Mono; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; /** * FEBS工具类 * * @author MrBird */ @Slf4j public abstract class FebsUtil { private static final String UNKNOW = "unknown"; /** * 驼峰转下划线 * * @param value 待转换值 * @return 结果 */ public static String camelToUnderscore(String value) { if (StringUtils.isBlank(value)) { return value; } String[] arr = StringUtils.splitByCharacterTypeCamelCase(value); if (arr.length == 0) { return value; } StringBuilder result = new StringBuilder(); IntStream.range(0, arr.length).forEach(i -> { if (i != arr.length - 1) { result.append(arr[i]).append("_"); } else { result.append(arr[i]); } }); return StringUtils.lowerCase(result.toString()); } /** * 下划线转驼峰 * * @param value 待转换值 * @return 结果 */ public static String underscoreToCamel(String value) { StringBuilder result = new StringBuilder(); String[] arr = value.split(StringConstant.UNDER_LINE); for (String s : arr) { result.append((String.valueOf(s.charAt(0))).toUpperCase()).append(s.substring(1)); } return result.toString(); } /** * 判断是否为 ajax请求 * * @param request HttpServletRequest * @return boolean */ public static boolean isAjaxRequest(HttpServletRequest request) { return (request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"))); } /** * 正则校验 * * @param regex 正则表达式字符串 * @param value 要匹配的字符串 * @return 正则校验结果 */ public static boolean match(String regex, String value) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(value); return matcher.matches(); } /** * 设置响应 * * @param response HttpServletResponse * @param contentType content-type * @param status http状态码 * @param value 响应内容 * @throws IOException IOException */ public static void makeResponse(HttpServletResponse response, String contentType, int status, Object value) throws IOException { response.setContentType(contentType); response.setStatus(status); response.getOutputStream().write(JSONObject.toJSONString(value).getBytes()); } /** * 设置成功响应 * * @param response HttpServletResponse * @param value 响应内容 * @throws IOException IOException */ public static void makeSuccessResponse(HttpServletResponse response, Object value) throws IOException { makeResponse(response, MediaType.APPLICATION_JSON_VALUE, HttpServletResponse.SC_OK, value); } /** * 设置失败响应 * * @param response HttpServletResponse * @param value 响应内容 * @throws IOException IOException */ public static void makeFailureResponse(HttpServletResponse response, Object value) throws IOException { makeResponse(response, MediaType.APPLICATION_JSON_VALUE, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, value); } /** * 设置JSON类型响应 * * @param response HttpServletResponse * @param status http状态码 * @param value 响应内容 * @throws IOException IOException */ public static void makeJsonResponse(HttpServletResponse response, int status, Object value) throws IOException { makeResponse(response, MediaType.APPLICATION_JSON_VALUE, status, value); } /** * 设置webflux模型响应 * * @param response ServerHttpResponse * @param contentType content-type * @param status http状态码 * @param value 响应内容 * @return Mono */ public static Mono makeWebFluxResponse(ServerHttpResponse response, String contentType, HttpStatus status, Object value) { response.setStatusCode(status); response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType); DataBuffer dataBuffer = response.bufferFactory().wrap(JSONObject.toJSONString(value).getBytes()); return response.writeWith(Mono.just(dataBuffer)); } /** * 封装前端分页表格所需数据 * * @param pageInfo pageInfo * @return Map */ public static Map getDataTable(IPage pageInfo) { Map data = new HashMap<>(2); data.put(PageConstant.ROWS, pageInfo.getRecords()); data.put(PageConstant.TOTAL, pageInfo.getTotal()); return data; } /** * 获取HttpServletRequest * * @return HttpServletRequest */ public static HttpServletRequest getHttpServletRequest() { return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); } /** * 获取请求IP * * @return String IP */ public static String getHttpServletRequestIpAddress() { HttpServletRequest request = getHttpServletRequest(); String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; } /** * 获取请求IP * * @param request ServerHttpRequest * @return String IP */ public static String getServerHttpRequestIpAddress(ServerHttpRequest request) { HttpHeaders headers = request.getHeaders(); String ip = headers.getFirst("x-forwarded-for"); if (ip != null && ip.length() != 0 && !UNKNOW.equalsIgnoreCase(ip)) { if (ip.contains(StringConstant.COMMA)) { ip = ip.split(StringConstant.COMMA)[0]; } } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = headers.getFirst("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = headers.getFirst("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = headers.getFirst("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = headers.getFirst("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = headers.getFirst("X-Real-IP"); } if (ip == null || ip.length() == 0 || UNKNOW.equalsIgnoreCase(ip)) { ip = Objects.requireNonNull(request.getRemoteAddress()).getAddress().getHostAddress(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; } /** * 判断是否包含中文 * * @param value 内容 * @return 结果 */ public static boolean containChinese(String value) { if (StringUtils.isBlank(value)) { return Boolean.FALSE; } Matcher matcher = RegexpConstant.CHINESE.matcher(value); return matcher.find(); } /** * 获取在线用户信息 * * @return CurrentUser 当前用户信息 */ public static CurrentUser getCurrentUser() { try { LinkedHashMap authenticationDetails = getAuthenticationDetails(); Object principal = authenticationDetails.get("principal"); ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(mapper.writeValueAsString(principal), CurrentUser.class); } catch (Exception e) { log.error("获取当前用户信息失败", e); return null; } } /** * 获取当前用户名称 * * @return String 用户名 */ public static String getCurrentUsername() { Object principal = getOauth2Authentication().getPrincipal(); if (principal instanceof FebsAuthUser) { return ((FebsAuthUser) principal).getUsername(); } return (String) getOauth2Authentication().getPrincipal(); } /** * 获取当前用户权限集 * * @return Collection权限集 */ public static Collection getCurrentUserAuthority() { return getOauth2Authentication().getAuthorities(); } /** * 获取当前令牌内容 * * @return String 令牌内容 */ public static String getCurrentTokenValue() { try { OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) getOauth2Authentication().getDetails(); return details.getTokenValue(); } catch (Exception ignore) { return null; } } public static void printSystemUpBanner(Environment environment) { String banner = "-----------------------------------------\n" + "服务启动成功,时间:" + DateUtil.formatFullTime(LocalDateTime.now(), DateUtil.FULL_TIME_SPLIT_PATTERN) + "\n" + "服务名称:" + environment.getProperty("spring.application.name") + "\n" + "端口号:" + environment.getProperty("server.port") + "\n" + "-----------------------------------------"; System.out.println(banner); } private static OAuth2Authentication getOauth2Authentication() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); return (OAuth2Authentication) authentication; } @SuppressWarnings("all") private static LinkedHashMap getAuthenticationDetails() { return (LinkedHashMap) getOauth2Authentication().getUserAuthentication().getDetails(); } }