CommonUtil.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. package com.fuint.common.util;
  2. import com.fuint.utils.StringUtil;
  3. import org.springframework.web.multipart.MultipartFile;
  4. import javax.servlet.http.HttpServletRequest;
  5. import java.io.*;
  6. import java.net.*;
  7. import java.text.SimpleDateFormat;
  8. import java.util.*;
  9. import java.util.regex.Pattern;
  10. import java.util.regex.Matcher;
  11. import java.lang.reflect.Field;
  12. /**
  13. * 通用工具
  14. *
  15. * Created by FSQ
  16. * CopyRight https://www.fuint.cn
  17. */
  18. public class CommonUtil {
  19. /**
  20. * 对象转化成map
  21. *
  22. * @param obj 对象
  23. * @return
  24. * */
  25. public static Map<String, Object> convert(Object obj) throws IllegalAccessException {
  26. Map<String, Object> map = new HashMap<>();
  27. Class<?> clazz = obj.getClass();
  28. for (Field field : clazz.getDeclaredFields()) {
  29. field.setAccessible(true);
  30. map.put(field.getName(), field.get(obj));
  31. }
  32. return map;
  33. }
  34. /**
  35. * 隐藏手机号中间4位
  36. *
  37. * @param phone
  38. * @return
  39. * */
  40. public static String hidePhone(String phone) {
  41. if (StringUtil.isEmpty(phone)) {
  42. return "";
  43. }
  44. if (phone.length() < 11) {
  45. return phone;
  46. }
  47. return phone.substring(0, 3) + "****" + phone.substring(7);
  48. }
  49. /**
  50. * 功能:将输入字符串的首字母改成大写
  51. *
  52. * @param str
  53. * @return
  54. */
  55. public static String firstLetterToUpperCase(String str) {
  56. char[] ch = str.toCharArray();
  57. if (ch[0] >= 'a' && ch[0] <= 'z') {
  58. ch[0] = (char) (ch[0] - 32);
  59. }
  60. return new String(ch);
  61. }
  62. /**
  63. * 功能:将输入字符串的首字母改成驼峰格式
  64. *
  65. * @param str
  66. * @return
  67. */
  68. public static String toCamelCase(String str) {
  69. if (str == null) {
  70. return null;
  71. }
  72. str = str.toLowerCase();
  73. StringBuilder sb = new StringBuilder();
  74. boolean upperCase = false;
  75. for (int i = 0; i < str.length(); i++) {
  76. char c = str.charAt(i);
  77. if (c == '_') {
  78. upperCase = true;
  79. } else if (upperCase) {
  80. sb.append(Character.toUpperCase(c));
  81. upperCase = false;
  82. } else {
  83. sb.append(c);
  84. }
  85. }
  86. return sb.toString();
  87. }
  88. /**
  89. * 判断是否UTF-8编码
  90. *
  91. * @param str
  92. * @return
  93. * */
  94. public static boolean isUtf8(String str) {
  95. try {
  96. byte[] bytes = str.getBytes("UTF-8");
  97. String newStr = new String(bytes, "UTF-8");
  98. return str.equals(newStr);
  99. } catch (UnsupportedEncodingException e) {
  100. e.printStackTrace();
  101. }
  102. return false;
  103. }
  104. /**
  105. * 判断是否乱码
  106. *
  107. * @param str
  108. * @return
  109. * */
  110. public static boolean isErrCode(String str) {
  111. return !(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(str));
  112. }
  113. /**
  114. * 判断是否数字
  115. *
  116. * @param str 字符串
  117. * @return
  118. * */
  119. public static boolean isNumeric(String str) {
  120. if (StringUtil.isEmpty(str)) {
  121. return false;
  122. }
  123. Pattern pattern = Pattern.compile("[0-9]*\\.?[0-9]+");
  124. Matcher isNum = pattern.matcher(str);
  125. if (!isNum.matches()) {
  126. return false;
  127. }
  128. return true;
  129. }
  130. /**
  131. * 生成随机会员号(13位数)
  132. *
  133. * @return
  134. * */
  135. public static String createUserNo() {
  136. StringBuilder sb = new StringBuilder("8");
  137. sb.append(SeqUtil.getRandomNumber(4));
  138. sb.append(SeqUtil.getRandomNumber(4));
  139. sb.append(SeqUtil.getRandomNumber(4));
  140. return sb.toString();
  141. }
  142. /**
  143. * 生成随机键值号
  144. *
  145. * @return
  146. * */
  147. public static String createAccountKey() {
  148. StringBuilder sb = new StringBuilder("11");
  149. sb.append(SeqUtil.getRandomNumber(6));
  150. sb.append(SeqUtil.getRandomNumber(5));
  151. String t = TimeUtils.formatDate(new Date(), "yyyyMMddHH");
  152. return t + sb.toString();
  153. }
  154. /**
  155. * 生成随机商户号
  156. *
  157. * @return
  158. * */
  159. public static String createMerchantNo() {
  160. StringBuilder sb = new StringBuilder("8");
  161. sb.append(SeqUtil.getRandomNumber(4));
  162. sb.append(SeqUtil.getRandomNumber(4));
  163. return sb.toString();
  164. }
  165. /**
  166. * 生成随机结算单号(13位数)
  167. *
  168. * @return
  169. * */
  170. public static String createSettlementNo() {
  171. StringBuilder sb = new StringBuilder("8");
  172. sb.append(SeqUtil.getRandomNumber(4));
  173. sb.append(SeqUtil.getRandomNumber(4));
  174. sb.append(SeqUtil.getRandomNumber(4));
  175. return sb.toString();
  176. }
  177. /**
  178. * 生成随机订单号
  179. *
  180. * @param userId
  181. * @return
  182. * */
  183. public static String createOrderSN(String userId) {
  184. // 时间是17位
  185. String date = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyyMMddHHmmssSSS");
  186. StringBuilder sb = new StringBuilder();
  187. sb.append(date);
  188. // 目前的会员id为9位,不确定后面会不会变更
  189. if (userId.length() > 9) {
  190. sb.append(userId.substring(userId.length() - 9, 9));
  191. }
  192. if (userId.length() == 9) {
  193. sb.append(userId);
  194. }
  195. // 如果小于9位补位
  196. if (userId.length() < 9) {
  197. for (int i = 0; i < userId.length() - 9; i++) {
  198. sb.append("0");
  199. }
  200. }
  201. // 加上4位随机数
  202. sb.append(SeqUtil.getRandomNumber(4));
  203. return sb.toString();
  204. }
  205. /**
  206. * 获取IP地址
  207. *
  208. * @param request
  209. * @return String
  210. */
  211. public static String getIPFromHttpRequest(HttpServletRequest request) {
  212. String ipAddress;
  213. try {
  214. ipAddress = request.getHeader("x-forwarded-for");
  215. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  216. ipAddress = request.getHeader("Proxy-Client-IP");
  217. }
  218. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  219. ipAddress = request.getHeader("WL-Proxy-Client-IP");
  220. }
  221. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  222. ipAddress = request.getRemoteAddr();
  223. if (ipAddress.equals("127.0.0.1")) {
  224. // 根据网卡取本机配置的IP
  225. InetAddress inet = null;
  226. try {
  227. inet = InetAddress.getLocalHost();
  228. } catch (UnknownHostException e) {
  229. e.printStackTrace();
  230. }
  231. ipAddress = inet.getHostAddress();
  232. }
  233. }
  234. // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  235. if (ipAddress != null && ipAddress.length() > 15) {
  236. if (ipAddress.indexOf(",") > 0) {
  237. ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
  238. }
  239. }
  240. } catch (Exception e) {
  241. ipAddress = "";
  242. }
  243. if (!isValidIP(ipAddress)) {
  244. return "127.0.0.1";
  245. }
  246. return ipAddress;
  247. }
  248. /**
  249. * 验证ip地址是否正确
  250. *
  251. * @param ip
  252. * @return
  253. * */
  254. public static boolean isValidIP(String ip) {
  255. if ((ip != null) && (!ip.isEmpty())) {
  256. return Pattern.matches("^([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}$", ip);
  257. }
  258. return false;
  259. }
  260. /**
  261. * 保存上传文件
  262. *
  263. * @param file 上传的文件
  264. * @param filePath 文件路径
  265. * @return
  266. * */
  267. public static void saveMultipartFile(MultipartFile file, String filePath) {
  268. if (file != null && !file.isEmpty()) {
  269. try {
  270. FileOutputStream os = new FileOutputStream(new File(filePath));
  271. //拿到上传文件的输入流
  272. os.write(file.getBytes());
  273. os.close();
  274. } catch (IOException e) {
  275. e.printStackTrace();
  276. }
  277. }
  278. }
  279. /**
  280. * 格式化指定的日期
  281. *
  282. * @param date
  283. * @param formatStr
  284. * @return
  285. */
  286. public static String formatDate(Date date, String formatStr) {
  287. if (date == null) date = new Date();
  288. if (StringUtil.isEmpty(formatStr)) formatStr = "yyyy-MM-dd";
  289. SimpleDateFormat dateFormater = new SimpleDateFormat(formatStr);
  290. return dateFormater.format(date);
  291. }
  292. /**
  293. * 去除待带script、src的语句,转义替换后的value值
  294. *
  295. * @param value
  296. *
  297. * @return
  298. */
  299. public static String replaceXSS(String value) {
  300. if (value != null) {
  301. try {
  302. value = value.replace("+","%2B");
  303. value = URLDecoder.decode(value, "utf-8");
  304. } catch(Exception e) {
  305. //empty
  306. }
  307. StringBuilder buf = new StringBuilder(value.length());
  308. int len = value.length();
  309. for (int i = 0; i < len; i++) {
  310. char codePoint = value.charAt(i);
  311. if (isEmojiCharacter(codePoint)) {
  312. buf.append("*");
  313. } else {
  314. buf.append(codePoint);
  315. }
  316. }
  317. String emojiStr = buf.toString();
  318. if (!StringUtil.isEmpty(emojiStr)) {
  319. value = emojiStr;
  320. }
  321. // Avoid null characters
  322. value = value.replaceAll("\0", "");
  323. // Avoid anything between script tags
  324. Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
  325. value = scriptPattern.matcher(value).replaceAll("");
  326. // Avoid anything in a src='...' type of e­xpression
  327. scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  328. value = scriptPattern.matcher(value).replaceAll("");
  329. scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  330. value = scriptPattern.matcher(value).replaceAll("");
  331. // Remove any lonesome </script> tag
  332. scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
  333. value = scriptPattern.matcher(value).replaceAll("");
  334. // Remove any lonesome <script ...> tag
  335. scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  336. value = scriptPattern.matcher(value).replaceAll("");
  337. // Avoid eval(...) e­xpressions
  338. scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  339. value = scriptPattern.matcher(value).replaceAll("");
  340. // Avoid e­xpression(...) e­xpressions
  341. scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  342. value = scriptPattern.matcher(value).replaceAll("");
  343. // Avoid javascript:... e­xpressions
  344. scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
  345. value = scriptPattern.matcher(value).replaceAll("");
  346. // Avoid alert:... e­xpressions
  347. scriptPattern = Pattern.compile("alert", Pattern.CASE_INSENSITIVE);
  348. value = scriptPattern.matcher(value).replaceAll("");
  349. // Avoid οnlοad= e­xpressions
  350. scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  351. value = scriptPattern.matcher(value).replaceAll("");
  352. scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);
  353. value = scriptPattern.matcher(value).replaceAll("");
  354. }
  355. return filter(value);
  356. }
  357. /**
  358. * 判断是否emo表情
  359. *
  360. * @param first 字符串
  361. * @return
  362. * */
  363. public static boolean isEmojiCharacter(char first) {
  364. return !
  365. ((first == 0x0) ||
  366. (first == 0x9) ||
  367. (first == 0xA) ||
  368. (first == 0xD) ||
  369. ((first >= 0x20) && (first <= 0xD7FF)) ||
  370. ((first >= 0xE000) && (first <= 0xFFFD)) ||
  371. ((first >= 0x10000)))||
  372. (first == 0xa9 || first == 0xae || first == 0x2122 ||
  373. first == 0x3030 || (first >= 0x25b6 && first <= 0x27bf) ||
  374. first == 0x2328 || (first >= 0x23e9 && first <= 0x23fa))
  375. || ((first >= 0x1F000 && first <= 0x1FFFF))
  376. || ((first >= 0x2702) && (first <= 0x27B0))
  377. || ((first >= 0x1F601) && (first <= 0x1F64F));
  378. }
  379. /**
  380. * 处理html中的视频
  381. *
  382. * @param html
  383. * @return
  384. * */
  385. public static String fixVideo(String html) {
  386. // 正则表达式匹配<iframe>标签,并捕获src属性
  387. String iframeRegex = "<iframe[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";
  388. Pattern pattern = Pattern.compile(iframeRegex);
  389. Matcher matcher = pattern.matcher(html);
  390. // 用于存储替换后的HTML
  391. StringBuffer result = new StringBuffer();
  392. // 遍历所有匹配的<iframe>标签
  393. while (matcher.find()) {
  394. // 获取src属性的值
  395. String src = matcher.group(1);
  396. // 构建<video>标签
  397. String videoTag = "<video controls><source src=\"" + src + "\" type=\"video/mp4\">Your browser does not support the video tag.</video>";
  398. // 将匹配的<iframe>标签替换为<video>标签
  399. matcher.appendReplacement(result, videoTag);
  400. }
  401. // 将剩余的HTML内容追加到结果中
  402. matcher.appendTail(result);
  403. return result.toString();
  404. }
  405. /**
  406. * 过滤特殊字符
  407. *
  408. * @param value
  409. *
  410. * @return
  411. */
  412. public static String filter(String value) {
  413. if (value == null) {
  414. return null;
  415. }
  416. StringBuffer result = new StringBuffer(value.length());
  417. for (int i=0; i<value.length(); ++i) {
  418. switch (value.charAt(i)) {
  419. case '<':
  420. result.append("<");
  421. break;
  422. case '>':
  423. result.append(">");
  424. break;
  425. case '\'':
  426. result.append("'");
  427. break;
  428. case '%':
  429. result.append("%");
  430. break;
  431. case ';':
  432. result.append(";");
  433. break;
  434. case '(':
  435. result.append("(");
  436. break;
  437. case ')':
  438. result.append(")");
  439. break;
  440. case '&':
  441. result.append("&");
  442. break;
  443. case '+':
  444. result.append("+");
  445. break;
  446. default:
  447. result.append(value.charAt(i));
  448. break;
  449. }
  450. }
  451. return result.toString();
  452. }
  453. }