验证信息

package study.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import study.constans.AreaCode;

/**
 * @author zyh
 *
 */
public class IDCardUtil {

    private static final String[] ValCodeArr = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
    //加权因子
    private static final String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" };
   
    private static final String[] Day = { "31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31" };

	/**
	 * 
	 * @param IDCard
	 * @return
	 */
	public static String IDCardValidator(String IDCard){
		String error = "";//返回错误信息
        String Ai = "";
        
        if(IDCard.length() != 15 && IDCard.length() != 18){
        	error = "长度应该为15位或18位,请检查后重新输入\n你的:"+IDCard;
        	return error;
        }
        //
        if(IDCard.length() == 18){
        	Ai = IDCard.substring(0,18);
        }else if(IDCard.length() == 15){
        	//把15位转化成17位
        	if(!isNumeric(Ai)){
        		error = "15位应全为数字\n你的:"+Ai;
        		return error;
        	}
        	Ai = convertIDCard15bitTo17bit(IDCard);
        	if(!isNumeric(Ai)){
        		return Ai;
        	}
        }
        
        //判断15位是否全为数字,18位前17位是否都为数字
        if(isNumeric(Ai.substring(0,17)) == false){
        	error = "15位应全为数字,18位前17位为数字!\n你的:"+Ai;
        	return error ;
        }
        if(!isNumeric(Ai)){
        	if((Ai.length()) == 15){
        		return "不全为数字,请检查\n你的:"+Ai;
        	}
        	if((Ai.length()==18) && !isNumeric((Ai.substring(0,17)))){
        		return "不全为数字,请检查\n你的:"+Ai;
        	}
        	 //return "不全为数字,请检查";
        }
        //年
        String year = Ai.substring(6,10);
        //月
        String month = Ai.substring(10,12);
        //日
        String day = Ai.substring(12,14);
        //年应该在1900年后
        Date currectTime = new Date();
        String current = new SimpleDateFormat("yyyy").format(currectTime);
        if(Integer.parseInt(year)<1900 || Integer.parseInt(year) > Integer.parseInt(current)){
        	error = "出生日期应在公元1900年后,当前时间之前。\n你的:"+Ai;
        	return error;
        }
        //月份判断
        if(Integer.parseInt(month) > 12 || Integer.parseInt(month) == 0){
        	error = "出生日期中的月份不正确\n你的:"+Ai;
        	return error ;
        }
        //日期判断
        int index = Integer.parseInt(month);
        String aa = Day[index-1];
        //判断是否是2月
		if(index == 2){
			//判断是否是闰年
    		if(isLeapYear(year)){
    			aa = "29";   
    		}
    	}
		if(Integer.parseInt(day) > Integer.parseInt(aa)){
			error = "出生日期的天数不正确\n你的:"+Ai;
			return error ;
		}
		//判断前两位的区号
        String code = Ai.substring(0,2);
        if(!AreaCode.getAreaCode().containsKey(code)){
        	if (Ai.length()==15) {
        		error = "你是哪个省的?火星来的吗?\n你的:"+Ai.substring(0,6)+Ai.substring(8);
			}else{
				error = "你是哪个省的?火星来的吗?\n你的:"+Ai;
			}
        	return error ;
        }
        String iDCard = getPowerSumAndVerify(Ai);
        System.out.println(error+iDCard);
		return error+iDCard;
	}

	/**
	 * 判断字符串是否为数字
	 * @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;
		//str == null || "".equals(str) ? false : str.matches("^[0-9]*$");
	}

	/**
	 * 将15位转18位
	 * @param IDCard
	 * @return
	 */
	public static String convertIDCard15bitTo17bit(String IDCard){
		String IDCard17 = null;
		if(IDCard.length() != 15){
			return null;
		}
		if(!isNumeric(IDCard)){
			return "15位应都为数字,请检查。\n你的:"+IDCard;
		}
		String birthday = IDCard.substring(6,12);
		Date birthdate = null;
		try {
			birthdate = new SimpleDateFormat("yyyyMMdd").parse("19"+birthday);
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(birthdate);
			String year = String.valueOf(calendar.get(Calendar.YEAR));
			IDCard17 = IDCard.substring(0,6) + year + IDCard.substring(8);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return IDCard17;	

	}

	/**
	 * 返回加权总和,并拼接最后一位校验码
	 * @param str
	 * @return
	 */
	public static String getPowerSumAndVerify(String str){
		int totalmulWiAi = 0;
		String strVerifyCode = "";
		//循环取得前17位加权平均和
		for(int i = 0;i < 17;i++){
			totalmulWiAi = totalmulWiAi 
					+ Integer.parseInt(String.valueOf(str.charAt(i)))
					* Integer.parseInt(Wi[i]);
		}
		//取得前17位加权平均和的余数
		int modValue = totalmulWiAi % 11;
		strVerifyCode = ValCodeArr[modValue].toUpperCase();
		String str1 = str.substring(0,17);
		str1 = str1 + strVerifyCode;
		if(str.length()==17){
			str1 = str + strVerifyCode;
			return str1;
		}
		String last = str.substring(str.length()-1).toUpperCase();

		if(!strVerifyCode.equals(last)){
			return "最后一位验证码不正确\n你的:"+str;
		}
		return str1;
	}

	/**
	 * 是否为闰年
	 * @param str
	 * @return
	 */
	public static boolean isLeapYear(String str){
		int year = Integer.parseInt(str);
		if((year % 4 == 0) && (year % 100 != 0) || year % 400 ==0){
			return true;
		}
		return false;
	}

	public static void main(String[] args) {

		System.out.println(IDCardUtil.IDCardValidator("118954199009230984"));
	}
}
时间: 2024-08-10 17:01:22

验证信息的相关文章

看好你的门-确保验证机制的安全(3)-正确处理验证信息

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 前提 执行安全的验证机制,不仅仅要同时满足几个关键安全目标,许多的时候也需要牺牲其他目标.比如易用性.成本.还有功能. 2. 正确处理验证信息的基本要求 一些基本要求,写下来,以后也可以参考. 1. 要确认完整的用户名和密码等信息:也就是说,要区分大小写,不过滤或者修改任何字符,不添加也不截断密码: 2. 应用程序要在处理验证信息的过程中,主动防御无法预料的时间.重要的是,如果系统无法

在ASP.NET MVC中使用Knockout实践07,自定义验证信息的位置与内容

在前两篇中,体验了Knockout的基本验证和自定义验证.本篇自定义验证信息的显示位置与内容. 自定义验证信息的显示位置 通常,Knockout的验证信息紧跟在input后面,通过validationMessage属性可以自定义验证信息的显示位置. @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <style type="text/css">

Python+selenium之获取验证信息

通常获取验证信息用得最多的几种验证信息分别是title,URL和text.text方法用于获取标签对之间的文本信息. 代码如下: from selenium import webdriverimport timedriver = webdriver.Firefox()driver.get("http://XXX.XXX.XXX.XXX/oneCard/login")#打印当前页面titletitle = driver.titleprint(title)#打印当前页面的URLnow_ur

MVC扩展控制器, 把部分视图转换成字符串(带验证信息), 并以json传递给前端视图

当我们使用jQuery异步提交表单数据的时候,需要把部分视图转换成字符串(带验证信息),以json的形式传递给前端视图. 使用jQuery异步加载部分视图,返回内容追加到页面某个div: jQuery异步提交失败,返回带验证失败信息的部分视图字符串,并追加到页面div: jQuery异步提交成功,返回显示提交成功的部分视图字符串,并追加到页面div: 一个简单的Model: using System.ComponentModel.DataAnnotations; namespace MvcApp

建立两台linux信任关系(scp时不用输入验证信息)

在大规模部署时,需要建立多个ssh连接,但是linux默认需要输入验证信息,如此一来本来是一件简单的事却变的非常繁琐耗时.现在就来介绍怎样自动ssh一台linux(不需要输入验证信息). 首先我拿两台linux服务器模拟,地址分别是192.168.22.128.192.168.22.133,我想把192.168.22.128上的东西用scp远程拷贝到192.168.22.133上,步骤如下: 在没做任何操作之前,用scp远程传东西,会有提示需要输入验证信息,如下图: 在192.168.22.12

使用tooltip显示jquery.validate.unobtrusive验证信息

通过重写CSS实现使用tooltip显示jquery.validate.unobtrusive验证信息,效果如图: 1. 在ViewModel中定义验证规则 [Display(Name = "纬度")] [Required(ErrorMessage = "{0}不能为空")] [RegularExpression(@"^\-?\d+(\.\d+)?$", ErrorMessage = "{0}格式不正确,请输入数值")] [R

发送邮箱验证信息的工具类

package cn.itcast.travel.util; import javax.mail.*;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.util.Properties; /** * 发邮件工具类 */public final class MailUtils { private static final String USER = "[email

html5 自定义验证信息

h5 为表单新增了很多类型,及属性. 根据这些新增的类型及属性 h5也为我们提供了验证这些数据的js函数,这些验证表单的函数都存在了ValidityState对象中,接下来让我们一起来了解一下这些函数的用法: ValidityState对象 ValidityState对象是通过validity 属性获取的,该对象有8个属性,分别针对8个方面的错误验证,属性值均为布尔值. 1.valueMissing属性 必填的表单元素的值为空. 如果表单元素设置了required特性,则为必填项.如果必填项的值

SpringBoot学习之验证信息国际过

以登录为例: 1.controller的登录方法: @RequestMapping("/SSOAuth/login") @ResponseBody public ResponseValue login(@Valid @RequestBody LoginParam param, BindingResult result) { //验证数据合法性 if (result.hasErrors()) { ResponseValue responseValue = ResponseValue.ne

tp框架验证信息

今天在这里我们学习一下tp框架里面怎么做验证. 验证又分为两种:静态验证.动态验证 首先,我们还是先做一个html界面,名为add.html.代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://ww