Tools.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. package com.nuliji.tools;
  2. import org.apache.commons.codec.binary.Base64;
  3. import org.dom4j.Document;
  4. import org.dom4j.DocumentException;
  5. import org.dom4j.DocumentHelper;
  6. import org.dom4j.Element;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import javax.crypto.Mac;
  10. import javax.crypto.SecretKey;
  11. import javax.crypto.spec.SecretKeySpec;
  12. import javax.servlet.http.HttpServletRequest;
  13. import java.io.UnsupportedEncodingException;
  14. import java.security.InvalidKeyException;
  15. import java.security.MessageDigest;
  16. import java.security.NoSuchAlgorithmException;
  17. import java.util.*;
  18. import java.util.regex.Matcher;
  19. import java.util.regex.Pattern;
  20. /**
  21. * Created by gaojie on 2017/11/9.
  22. */
  23. public class Tools {
  24. private static final Logger logger = LoggerFactory.getLogger(Tools.class);
  25. protected static Random random = new Random();
  26. public static String stringMD5(String str) {
  27. return byteArrayToHexString(getMd5(str));
  28. }
  29. public static String stringSha1(String str) {
  30. return byteArrayToHexString(getSha1(str));
  31. }
  32. public static int getRandom() {
  33. return random.nextInt(999999)%900000+100000;
  34. }
  35. public static String getRandomString(int length){
  36. String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  37. Random random=new Random();
  38. StringBuffer sb=new StringBuffer();
  39. for(int i=0;i<length;i++){
  40. int number=random.nextInt(62);
  41. sb.append(str.charAt(number));
  42. }
  43. return sb.toString();
  44. }
  45. /**
  46. * 取得指定月份的最大天数
  47. *
  48. * @param date 月份,格式yyyy-MM
  49. * @return
  50. */
  51. public static int getMonthDays(String date) {
  52. Calendar calendar = Calendar.getInstance();
  53. calendar.set(Calendar.YEAR, Integer.parseInt(date.substring(0, 4)));
  54. calendar.set(Calendar.MONTH, Integer.parseInt(date.substring(5, 7)) - 1);
  55. int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
  56. return maxDay;
  57. }
  58. public static int getDayOfMonth(Date date) {
  59. Calendar calendar = Calendar.getInstance();
  60. calendar.setTime(date);
  61. return calendar.get(Calendar.DAY_OF_MONTH);
  62. }
  63. public static int getDayOfWeek(Date date){
  64. Calendar calendar = Calendar.getInstance();
  65. calendar.setTime(date);
  66. return calendar.get(Calendar.DAY_OF_WEEK);
  67. }
  68. public static byte[] getMd5(String str) {
  69. try {
  70. MessageDigest md = MessageDigest.getInstance("MD5");
  71. md.update(str.getBytes("utf-8"));
  72. return md.digest();
  73. } catch (Exception e) {
  74. System.out.println(e);
  75. }
  76. return null;
  77. }
  78. public static byte[] getSha1(String str){
  79. try {
  80. MessageDigest md = MessageDigest.getInstance("SHA-1");
  81. md.update(str.getBytes("utf-8"));
  82. return md.digest();
  83. } catch (Exception e) {
  84. System.out.println(e);
  85. }
  86. return null;
  87. }
  88. public static byte[] getHmacSha1(String str, String key){
  89. try {
  90. byte[] data=key.getBytes("utf-8");
  91. //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
  92. SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
  93. //生成一个指定 Mac 算法 的 Mac 对象
  94. Mac mac = Mac.getInstance("HmacSHA1");
  95. //用给定密钥初始化 Mac 对象
  96. mac.init(secretKey);
  97. byte[] text = str.getBytes("utf-8");
  98. //完成 Mac 操作
  99. return mac.doFinal(text);
  100. } catch (NoSuchAlgorithmException e) {
  101. e.printStackTrace();
  102. } catch (UnsupportedEncodingException e) {
  103. e.printStackTrace();
  104. } catch (InvalidKeyException e) {
  105. e.printStackTrace();
  106. }
  107. return null;
  108. }
  109. public static String byteArrayToHexString(byte[] b) {
  110. String ret = "";
  111. for (int i = 0; i < b.length; i++) {
  112. String hex = Integer.toHexString(b[i] & 255);
  113. if (hex.length() == 1) {
  114. hex = '0' + hex;
  115. }
  116. ret += hex;
  117. }
  118. return ret;
  119. }
  120. /**
  121. * @param bytes
  122. * @return
  123. */
  124. public static byte[] decodeBase64(final byte[] bytes) {
  125. return Base64.decodeBase64(bytes);
  126. }
  127. /**
  128. * @param str
  129. * @return
  130. */
  131. public static byte[] decodeBase64(final String str) {
  132. return Base64.decodeBase64(str.getBytes());
  133. }
  134. /**
  135. * 二进制数据编码为BASE64字符串
  136. *
  137. * @param bytes
  138. * @return
  139. * @throws Exception
  140. */
  141. public static String encodeBase64(final byte[] bytes) {
  142. return new String(Base64.encodeBase64(bytes));
  143. }
  144. public static String encodeBase64(final String str) {
  145. return encodeBase64(str.getBytes());
  146. }
  147. //求两个字符串数组的并集,利用set的元素唯一性
  148. public static <T> Collection<T> union(Collection<T> arr1, Collection<T> arr2) {
  149. Set<T> set = new HashSet<T>();
  150. set.addAll(arr1);
  151. set.addAll(arr2);
  152. return set;
  153. }
  154. //求两个数组的交集
  155. public static <T> Collection<T> intersect(Collection<T> arr1, Collection<T> arr2) {
  156. Map<T, Boolean> map = new HashMap<T, Boolean>();
  157. LinkedList<T> list = new LinkedList<T>();
  158. for (T str : arr1) {
  159. if (!map.containsKey(str)) {
  160. map.put(str, Boolean.FALSE);
  161. }
  162. }
  163. for (T str : arr2) {
  164. if (map.containsKey(str)) {
  165. map.put(str, Boolean.TRUE);
  166. }
  167. }
  168. for (Map.Entry<T, Boolean> e : map.entrySet()) {
  169. if (e.getValue().equals(Boolean.TRUE)) {
  170. list.add(e.getKey());
  171. }
  172. }
  173. return list;
  174. }
  175. //求两个数组的差集: 第一个不在第二个中的元素
  176. public static <T> Collection<T> minus(Collection<T> arr1, Collection<T> arr2) {
  177. LinkedList<T> list = new LinkedList<T>();
  178. list.addAll(arr1);
  179. for (T str : arr2) {
  180. if (list.contains(str)) {
  181. list.remove(str);
  182. }
  183. }
  184. return list;
  185. }
  186. public static String joinIds(Collection ids) {
  187. List<String> list = new ArrayList<>();
  188. // logger.debug("join:{}", ids);
  189. if(ids == null || ids.size() == 0) return "";
  190. for (Object id : ids) {
  191. list.add(id.toString());
  192. }
  193. return String.join(",", list);
  194. }
  195. public static Collection<Long> splitIds(String ids){
  196. List<Long> l = new ArrayList<>();
  197. // logger.debug("split:{}", ids);
  198. if(ids == null || ids.length() == 0) return l;
  199. String[] list = ids.split(",");
  200. for(String s:list){
  201. l.add(Long.valueOf(s));
  202. }
  203. return l;
  204. }
  205. public static String getClientIp(HttpServletRequest request){
  206. String ipAddress = request.getHeader("x-forwarded-for");
  207. if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  208. ipAddress = request.getRemoteAddr();
  209. }
  210. //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  211. if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
  212. if(ipAddress.indexOf(",")>0){
  213. ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
  214. }
  215. }
  216. return ipAddress;
  217. }
  218. public static Date today(){
  219. Calendar calendar = Calendar.getInstance();
  220. calendar.setTime(new Date());
  221. calendar.set(Calendar.HOUR_OF_DAY, 0);
  222. calendar.set(Calendar.MINUTE, 0);
  223. calendar.set(Calendar.SECOND, 0);
  224. return calendar.getTime();
  225. }
  226. public static Date day(Date date){
  227. Calendar calendar = Calendar.getInstance();
  228. calendar.setTime(date);
  229. calendar.set(Calendar.HOUR_OF_DAY, 0);
  230. calendar.set(Calendar.MINUTE, 0);
  231. calendar.set(Calendar.SECOND, 0);
  232. return calendar.getTime();
  233. }
  234. public static int yearNumber(Date date){
  235. Calendar calendar = Calendar.getInstance();
  236. calendar.setTime(date);
  237. return calendar.get(Calendar.YEAR);
  238. }
  239. public static int monthNumber(Date date){
  240. Calendar calendar = Calendar.getInstance();
  241. calendar.setTime(date);
  242. return calendar.get(Calendar.MONTH);
  243. }
  244. public static Date month(Date date){
  245. Calendar calendar = Calendar.getInstance();
  246. calendar.setTime(date);
  247. calendar.set(Calendar.DAY_OF_MONTH, 1);
  248. calendar.set(Calendar.HOUR_OF_DAY, 0);
  249. calendar.set(Calendar.MINUTE, 0);
  250. calendar.set(Calendar.SECOND, 0);
  251. return calendar.getTime();
  252. }
  253. public static int hour(Date date){
  254. Calendar calendar = Calendar.getInstance();
  255. calendar.setTime(date);
  256. return calendar.get(Calendar.HOUR_OF_DAY);
  257. }
  258. public static Date addHour(Date date, int hour){
  259. Calendar c = Calendar.getInstance();
  260. c.setTime(date);
  261. c.add(Calendar.HOUR, hour);
  262. return c.getTime();
  263. }
  264. public static Date addDate(Date date, int day){
  265. Calendar c = Calendar.getInstance();
  266. c.setTime(date);
  267. c.add(Calendar.DAY_OF_YEAR, day);
  268. return c.getTime();
  269. }
  270. public static Date addMonth(Date date, int month){
  271. Calendar c = Calendar.getInstance();
  272. c.setTime(date);
  273. c.add(Calendar.MONTH, month);
  274. return c.getTime();
  275. }
  276. public static Date addYear(Date date, int year){
  277. Calendar c = Calendar.getInstance();
  278. c.setTime(date);
  279. c.add(Calendar.YEAR, year);
  280. return c.getTime();
  281. }
  282. public static TreeMap<String, String> parseXml(String xml) {
  283. Document document = null;
  284. TreeMap<String, String> packageMap = new TreeMap<>();
  285. try {
  286. document = DocumentHelper.parseText(xml);
  287. } catch (DocumentException ex) {
  288. return null;
  289. }
  290. Element rootElement = document.getRootElement();
  291. for (Element element : (List<Element>) rootElement.elements()) {
  292. packageMap.put(element.getName(), element.getText());
  293. }
  294. return packageMap;
  295. }
  296. /**
  297. * 转换为下划线
  298. *
  299. * @param camelCaseName
  300. * @return
  301. */
  302. public static String underscoreName(String camelCaseName) {
  303. StringBuilder result = new StringBuilder();
  304. if (camelCaseName != null && camelCaseName.length() > 0) {
  305. result.append(camelCaseName.substring(0, 1).toLowerCase());
  306. for (int i = 1; i < camelCaseName.length(); i++) {
  307. char ch = camelCaseName.charAt(i);
  308. if (Character.isUpperCase(ch)) {
  309. result.append("_");
  310. result.append(Character.toLowerCase(ch));
  311. } else {
  312. result.append(ch);
  313. }
  314. }
  315. }
  316. return result.toString();
  317. }
  318. /**
  319. * 转换为驼峰
  320. *
  321. * @param underscoreName
  322. * @return
  323. */
  324. public static String camelCaseName(String underscoreName) {
  325. StringBuilder result = new StringBuilder();
  326. if (underscoreName != null && underscoreName.length() > 0) {
  327. boolean flag = false;
  328. for (int i = 0; i < underscoreName.length(); i++) {
  329. char ch = underscoreName.charAt(i);
  330. if ("_".charAt(0) == ch) {
  331. flag = true;
  332. } else {
  333. if (flag) {
  334. result.append(Character.toUpperCase(ch));
  335. flag = false;
  336. } else {
  337. result.append(ch);
  338. }
  339. }
  340. }
  341. }
  342. return result.toString();
  343. }
  344. }