校验手机号、身份证、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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值