package cc.mrbird.febs.common.utils; import cc.mrbird.febs.common.entity.CurrentUser; import cc.mrbird.febs.common.entity.constant.PageConstant; 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.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; 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.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; /** * FEBS工具类 * * @author MrBird */ @Slf4j public class FebsUtil { /** * 驼峰转下划线 * * @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("_"); 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()); } /** * 设置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<>(); 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 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".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 && !"unknown".equalsIgnoreCase(ip)) { if (ip.contains(",")) { ip = ip.split(",")[0]; } } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = headers.getFirst("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = headers.getFirst("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = headers.getFirst("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = headers.getFirst("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = headers.getFirst("X-Real-IP"); } if (ip == null || ip.length() == 0 || "unknown".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) { Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); Matcher m = p.matcher(value); return m.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() { return (String) getOAuth2Authentication().getPrincipal(); } /** * 获取当前用户权限集 * * @return Collection权限集 */ public static Collection getCurrentUserAuthority() { return getOAuth2Authentication().getAuthorities(); } /** * 获取当前令牌内容 * * @return String 令牌内容 */ public static String getCurrentTokenValue() { OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) getOAuth2Authentication().getDetails(); return details.getTokenValue(); } private static OAuth2Authentication getOAuth2Authentication() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); return (OAuth2Authentication) authentication; } @SuppressWarnings("all") private static LinkedHashMap getAuthenticationDetails() { return (LinkedHashMap) getOAuth2Authentication().getUserAuthentication().getDetails(); } }