发表于: 2017-12-15 21:22:24
1 626
今天完成的事情:
今天把自己想做的做出来了。
做了一个工具类专门用来加密解密。集成了字符串的转换和DES。
然后集成了2位师兄的方法做出来了自己的验证方法。本来想验证两条token可是发现那样的效果并不好,反而增加了代码的量。于是结合了两位师兄的方法。顺便在注册过程中加入了对用户名的唯一性的判断。
//用户名唯一性判断 这样是遍历出数据库里面所有的name 效率并不高 还需要加强
List<User> list = userService.nameList();
System.out.println(list);
//前台表单如果不输入数据,直接提交,值是"",而不是NULL
if(name==null||name.trim().equals("")){
logger.info("姓名不能为空");
return null;
}else if(password==null||password.trim().equals("") ) {
logger.info("密码不能为空");
return null;
}else if(1==1){
for (User user:list) {
if(name.equals(user.getName())){
System.out.println("name不能一样");
break;
}
}
} else {
password = MD5UtilAndSalt.getMD5(password);
logger.info("加密后的密码为:"+password);
userService.addUser(name, password);
return "web";
}
return null;
//这是一个把16进制转为字符编码,然后通过对字符解密,然后把解密后的字符编码转为字符串。
public static String decrypt(String token)throws Exception{
byte[] bytes = Transform.hexStringToByteArray(token);//把16进制字符串转为加密后字符编码
byte[] deByte = DESUtil.decrypt(bytes,"12345678");//把字符编码进行解密
String userInfo = new String(deByte);//把解密后的字符编码转化为字符串
System.out.println("输出解密后的字符串----->"+userInfo);
String userID="";
for(int i= 0;i<userInfo.length();i++){
char x = userInfo.charAt(i);
if(x=='='){
break;
}
userID+=x;
}
System.out.println("userID--->"+userID);//输出一下用户ID
return userID;}
Transfrom
//16进制字符串转化为字节数组
public static byte[] hexStringToByteArray(String str){
int len = str.length();
byte[] b = new byte[len/2];
for(int i = 0;i<len;i+=2 ){
b[i/2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character
.digit(str.charAt(i + 1), 16));
}
return b;
}
DES解密:
public static byte[] decrypt(byte[] src, String password) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
return cipher.doFinal(src);
}
加密过程不贴了。也是一些简单的东西。重要的是实现这些方法的思想。还有一些对时间格式的处理。
从前台获取时间后:
//把时间转化为对应的时间戳
public String forAdd(String name, Long QQ, String studyType, Date schoolTime){
Calendar calendar = Calendar.getInstance();
calendar.setTime(schoolTime);
Long newSchoolTime = calendar.getTimeInMillis();
System.out.println("newSchoolTime:"+newSchoolTime);
studentService.forAdd(name,QQ,studyType,newSchoolTime);
return "redirect:list";
}
通过DateTag把对应的时间戳转化为date类型 然后传到前端页面显示:
public int doStartTag() throws JspException {
String vv =" "+value;
long time =Long.valueOf(vv.trim());
Calendar c =Calendar.getInstance();
c.setTimeInMillis(time);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String s =simpleDateFormat.format(c.getTime());
try {
pageContext.getOut().write(s);
}catch (Exception e){
e.printStackTrace();
}
return super.doStartTag();}
前端显示:
<%@ taglib prefix="date" uri="/tags" %><td><date:date value="${s.schoolTime}"/></td>这里运用了任务四里面的时间Tag的概念。可以看一下页面效果吧
然后看一下数据库里面的
嗯,目前想实现的都能基本实现了,接下来的时间,把前面的任务1-5的东西整合一下。
明天计划的事情:
整合任务一至任务五。
遇到的问题:
没有太多问题,主要还是在一些方法上面的运用不够灵活,基础不牢靠的原因。
收获:
学会了对前端数据更改,然后加入数据库等的操作。
评论