校验手机号、身份证、IP地址、密码强度等常用方法
package cn.ncss.cy.core.utils; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import org.apache.shiro.crypto.hash.Md5Hash; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; public class CommonTool { private static final Logger log = LoggerFactory.getLogger(CommonTool.class); /** * md5加密 * * @param loginName * @return */ public final static String md5(String loginName) { Md5Hash md5LoginName = new Md5Hash(loginName); return md5LoginName.toHex(); } /** * 校验手机号注册 * * @param phone * @return */ public static boolean validateRegisterPhone(String phone, String regionCode) { if (!StringUtils.hasText(phone)) { return false; } if ("886".equals(regionCode)) { return phone.matches(StaticValue.DEFAULT_TW_PHONE_PATTERN); } else if ("852".equals(regionCode)) { return phone.matches(StaticValue.DEFAULT_HK_PHONE_PATTERN); } else if ("853".equals(regionCode)) { return phone.matches(StaticValue.DEFAULT_MO_PHONE_PATTERN); } else { return phone.matches(StaticValue.DEFAULT_PHONE_PATTERN); } } /** * 校验手机号 * * @param phone * @return */ public static boolean validatePhone(String phone) { if (!StringUtils.hasText(phone)) { return false; } if (phone.matches(StaticValue.DEFAULT_PHONE_PATTERN) || phone.matches(StaticValue.DEFAULT_TW_PHONE_PATTERN) || phone.matches(StaticValue.DEFAULT_HK_PHONE_PATTERN) || phone.matches(StaticValue.DEFAULT_MO_PHONE_PATTERN)) { return true; } else { return false; } } /** * 校验密码强度 * * @param phone * @return */ public static boolean validatePassword(String password) { if (!StringUtils.hasText(password)) { return false; } return password.matches(StaticValue.DEFAULT_PASSWORD_PATTERN); } /** * 获取ip地址 * * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { if (request == null) { return "unknown"; } String ip = request.getHeader("x-forwarded-for"); log.info(String.format("ip from x-forwarded-for: %s", ip)); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } 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("X-Forwarded-For"); } 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 ip; } /** * 根据GB 11714-1997标准对组织机构代码中的校验位进行校验 * * @param orgCode * 组织机构代码 * @return 是否正确的组织机构代码 */ public static boolean checkOrgCode(String orgCode) { if (!StringUtils.hasText(orgCode)) { return false; } orgCode = orgCode.replaceAll("-", ""); orgCode = orgCode.replaceAll("—", ""); orgCode = orgCode.replaceAll("-", ""); orgCode = orgCode.replaceAll("-", ""); if (orgCode.length() != 9 || orgCode.equals("000000000") || orgCode.equals("123456788")) return false; int chkNum = 0; // 校验数 int[] factors = { 3, 7, 9, 10, 5, 8, 4, 2 }; // 加权因子 // 取组织机构代码的八位本体代码为基数,与相应的加权因子相乘后求和,进行校验数的计算 for (int i = 0; i < 8; i++) { char ch = orgCode.charAt(i); int num = 0; // 获取八位本体代码并转换为相应的数字 if (ch >= "A" && ch <= "Z") { num = ch - "A" + 10; } else if (ch >= "0" && ch <= "9") { num = ch - "0"; } else { return false; // 含有数字字母以外的字符,直接返回错误 } num = num * factors[i]; // 取Wi本体代码与加权银子对应各位相乘 chkNum += num; // 乘积相加求和数 } chkNum = chkNum % 11; // 取模数11除和数,求余数 chkNum = 11 - chkNum; // 以模数11减余数,求校验码数值 if (chkNum == 11) { chkNum = 0; // 校验数为11时直接转换为0 } // 获取校验码,并跟校验数进行比较。校验数为10时候校验码应为“X” String chkCode = String.valueOf(orgCode.charAt(8)); if (chkCode.endsWith(String.valueOf(chkNum)) || (chkCode.equals("X") && chkNum == 10)) { return true; } else { return false; } } /** * 校验工商行政注册码 * * @param number * @return */ public static boolean checkRegisterNumber(String number) { if (number.length() != 15) { return false; } else if (!isNumeric(number)) {// 判断是否都是数字 if (number.endsWith("X") && ("NA".equals(number.substring(6, 8)) || "NB".equals(number.substring(6, 8)))) { return true; } return false; } // 对于此注册码的前六位的校验即:首次登记机关代码从工商行政注册号的编制规则 4.2来看,机关代码就全是地区代码, // 所以前六位目前暂无理由校验不合法 // 最后一位(第十五位)是校验位 int checkBit = Integer.parseInt(number.substring(14)); int num = checkNum(10, number.substring(0, 14)); if ((checkBit + num) % 10 == 1) { return true; } else { return false; } } /** * 检测字符传是否全为数字 * * @param str * @return */ public static boolean isNumeric(String str) { Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } /** * 按照GB/T 17710,MOD 11,10校验公式 最终递归循环得到 P_15 % 11,用于调用处来验证是否正确 * * @param P_num * @param subStr用来递归的子串 * @return */ public static int checkNum(int P_num, String subStr) { if ("".equals(subStr)) {// 直到递归无剩余子串,可返回结果 return P_num % 11; } int sub_Num = Integer.parseInt(subStr.substring(0, 1));// 每次截取第一位用来处理 sub_Num = P_num % 11 + sub_Num; P_num = (sub_Num % 10 != 0 ? sub_Num % 10 : 10) * 2; return checkNum(P_num, subStr.substring(1));// 下一次进入递归的内容则是出去第一位的其余子串 } public static BindingResult validateIdCard(BindingResult bindingResult, String idCardType, String idCard) { if (idCardType == null || idCard == null || idCardType.equals("") || idCard.equals("")) { bindingResult.rejectValue("idCardType", null, "请选择正确的证件类型"); return bindingResult; } if (idCardType.equals("ML")) { if (!CommonTool.validateMLcard(idCard)) { bindingResult.rejectValue("idCard", null, "请输入正确的证件号码"); return bindingResult; } } else if (idCardType.equals("HK")) { if (!CommonTool.validateHKCard(idCard)) { bindingResult.rejectValue("idCard", null, "请输入正确的证件号码"); return bindingResult; } } else if (idCardType.equals("MO")) { if (!CommonTool.validateMOCard(idCard)) { bindingResult.rejectValue("idCard", null, "请输入正确的证件号码"); return bindingResult; } } else if (idCardType.equals("TW")) { if (!CommonTool.validateTWCard(idCard)) { bindingResult.rejectValue("idCard", null, "请输入正确的证件号码"); return bindingResult; } } else if (idCardType.equals("HZ")) { } else if (idCardType.equals("QT")) { } else { bindingResult.rejectValue("idCardType", null, "请输入正确的证件类型"); return bindingResult; } return bindingResult; } /** * 检测身份证 * * @param value * @return */ public static boolean validateMLcard(String value) { int[] weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 校验码 int[] checkDigit = new int[] { 1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2 }; int sum = 0; if (value.matches( "((11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65|71|81|82|91)\d{4})((((19|20)(([02468][048])|([13579][26]))0229))|((20[0-9][0-9])|(19[0-9][0-9]))((((0[1-9])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[1,3-9])|(1[0-2]))(29|30))|(((0[13578])|(1[02]))31))))((\d{3}(x|X))|(\d{4}))") == true) { // 此循环是先取出身份证号码一个一个的取出,然后取出加权因子的数 一个一个的取出 最后算出他们的和 for (int i = 0; i < 17; i++) { int b = Integer.parseInt(value.substring(i, i + 1));// 取出输入身份证一个一个的号码 然后转化为Integer int a = weight[i];// 取出加权因子的一个一个的数 sum = a * b + sum;// 累加求和; } int mod = sum % 11; String idcard = value; if (value.contains("x")) { idcard = value.replace("x", "X"); } if (idcard.contains("X")) { if (idcard.substring(17, 18).charAt(0) == checkDigit[mod]) { return true; } else { return false; } } else { if (idcard.substring(17, 18).equals(String.valueOf(checkDigit[mod]))) { return true; } else { return false; } } } else { return false; } } public static boolean validateHZCard(String idCard) { if (idCard == null || idCard.equals("")) { return false; } if (!idCard.matches("^[A-Z]{1,2}[0-9]{6}\(?[0-9A]\)?$")) { return false; } return true; } public static boolean validateHKCard(String idCard) { String card = idCard.replaceAll("[\(|\)]", ""); if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) { return false; } if (!idCard.matches("^[A-Z]{1,2}[0-9]{6}\(?[0-9A]\)?$")) { return false; } Integer sum = 0; if (card.length() == 9) { sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9 + (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8; card = card.substring(1, 9); } else { sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8; } String mid = card.substring(1, 7); String end = card.substring(7, 8); char[] chars = mid.toCharArray(); Integer iflag = 7; for (char c : chars) { sum = sum + Integer.valueOf(c + "") * iflag; iflag--; } if (end.toUpperCase().equals("A")) { sum = sum + 10; } else { sum = sum + Integer.valueOf(end); } return (sum % 11 == 0) ? true : false; } public static boolean validateMOCard(String str) { String card = str.replaceAll("[\(|\)]", ""); if (card.length() != 8) { return false; } if (str.matches("^[1|5|7][0-9]{6}\(?[0-9A-Z]\)?$")) { return true; } return false; } public static boolean validateTWCard(String str) { String card = str.replaceAll("[\(|\)]", ""); if (card.length() != 10) { return false; } if (str.matches("^[a-zA-Z][0-9]{9}$")) { return true; } return false; } // 判断密码强度 public static String getLevel(String password) { if (password.matches("^\d+$") || password.matches("^[a-zA-Z]+$") || password.matches("^[-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$")) { return "LOW"; } else if (password.matches("^(?!\d+$)(?![a-zA-Z]+$)[a-zA-Z\d]+$") || password.matches( "^(?![a-zA-Z]+$)(?![-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$)[a-zA-Z-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$") || password.matches( "^(?!\d+)(?![-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$)[\d-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$")) { return "MIDDLE"; } else if (password.matches( "^(?![a-zA-z]+$)(?!\d+$)(?![-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$)(?![a-zA-z\d]+$)(?![a-zA-z-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$)(?![\d-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$)[a-zA-Z\d-`=\;",./~!@#$%^&*()_+|{}:"<>\[\]?]+$")) { return "HIGH"; } return "LOW"; } public static String jsonizeCode(String key, Object value) { return String.format(""%s":"%s",", key, value); } public static String jsonizeDes(String key, Object value) { return String.format(""%s":"%s"", key, value); } public static HttpServletResponse setHeader(String downloadType, String fileType, String name, HttpServletRequest request, HttpServletResponse response) { if ("downloadphysical".equals(downloadType) || "attachment".equals(downloadType)) { if (fileType.equals(".pdf")) { response.setContentType("application/pdf"); } else if (fileType.equals(".doc")) { response.setContentType("application/msword"); } else { response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); } } else if ("downloadpptx".equals(downloadType)) { response.setContentType("application/vnd.ms-powerpoint"); } else if ("downloadvideo".equals(downloadType)) { response.setContentType("video/mpeg"); } else if ("downloadzip".equals(downloadType)) { response.setContentType("application/zip"); } String agent = request.getHeader("USER-AGENT"); String headerFilename = null; try { if ((agent != null) && (-1 != agent.indexOf("MSIE") || -1 != agent.indexOf("Trident") || -1 != agent.indexOf("Edge"))) { headerFilename = "attachment;filename=" + URLEncoder.encode(name.replace(",", ",") + fileType, "UTF-8"); } else { headerFilename = "attachment;filename=" + new String((name.replace(",", ",") + fileType).getBytes("UTF-8"), "ISO-8859-1"); } } catch (UnsupportedEncodingException e) { log.error(e.toString()); } response.setHeader("Content-Disposition", headerFilename); return response; } public static void downFile(File file, HttpServletRequest request, HttpServletResponse response) { try (InputStream in = new FileInputStream(file); ServletOutputStream os = response.getOutputStream()) { byte[] data = new byte[1024]; int readed = 0; while ((readed = in.read(data)) != -1) { os.write(data, 0, readed); } os.flush(); } catch (Exception e) { log.error(e.toString()); } } /** * 验证头像 * * @param file * @param bindingResult * @return */ public static BindingResult validateHeadPortrait(Part file, BindingResult bindingResult) { if (file == null || file.getSize() <= 1) { bindingResult.rejectValue("fileUri", null, "个人头像文件不能为空"); return bindingResult; } if (hasSizeError(file)) { bindingResult.rejectValue("fileUri", null, "个人头像文件大小不符合要求"); return bindingResult; } String fileName = file.getSubmittedFileName().toLowerCase(); String fileSuffix = fileName.substring(fileName.lastIndexOf(".")); if (hasImageFormatError(fileSuffix)) { bindingResult.rejectValue("fileUri", null, "个人头像文件格式不符合要求"); return bindingResult; } return bindingResult; } /** * 验证文件大小 * * @param file * @return */ public static boolean hasSizeError(Part file) { if (file.getSize() > StaticValue.TALENT_HEAD_PORTRAIT_MAX_SIZE) { return true; } return false; } /** * 验证格式 * * @param file * @return */ public static boolean hasImageFormatError(String fileSuffix) { if (fileSuffix.equalsIgnoreCase(".jpg") || fileSuffix.equalsIgnoreCase(".jpeg") || fileSuffix.equalsIgnoreCase(".png") || fileSuffix.equalsIgnoreCase(".gif")) { return false; } return true; } /** * 验证名片文件大小 * * @param file * @return */ public static boolean hasSizeErrorCard(Part file) { if (file.getSize() > StaticValue.CARD_MAX_SIZE) { return true; } return false; } }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 一个正则表达式验证密码强度
- 下一篇: 华为OJ——密码强度等级