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;
}
}
校验手机号、身份证、IP地址、密码强度等常用方法
最新推荐文章于 2022-05-05 10:12:53 发布