发表于: 2018-03-04 23:47:03
2 644
完成
重写了prehandle用来拦截,拦截器里通过Cookie中判断Token的有效性来判断用户是否登录
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
//获取cookie
Cookie[] cookies = request.getCookies();
System.out.println("cookie:" + cookies);
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
//遍历每一个cookie,看看是否有一个cookie的name等于“Token”
if (cookies[i].getName().equals("Token")) {
System.out.println("开始拦截");
//把这个Token的值取出来
String token = cookies[i].getValue();
System.out.println("token:" + token);
//解密这个Token的值
String tokenDecrypt = new DesUtil("wlj").decrypt(token);
System.out.println("tDecrypt:" + tokenDecrypt);
//解密后的值用,分开
String[] arrToken = tokenDecrypt.split(",");
for (String s : arrToken) {
System.out.println(s);
}
//查询数据表
User user = userService.selectUserByName(arrToken[i - 1]);
String logUserTime = user.getTime() + "";
System.out.println("user:" + user);
System.out.println("logUserTime:" + logUserTime);
//判断登录时间对不对
if (arrToken[i].equals(logUserTime)) {
System.out.println("正确");
return true;
}
}
}
}
System.out.println("错误");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Controller的方法已经被调用,执行postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("执行afterCompletion\n\n");
进入/t11,控制台输出结果:
这里拦截/t11时,报错:
百度了一下:产生这个异常的原因有多种方面,单就如 Software caused 所示,
这个时候就会出错 .
但是等一会又能打开,可能连接自动释放了,所以也变没有去解决这个问题
2.使用MD5加密密码
代码如下
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String Four(User user, Model model) {
Long date = System.currentTimeMillis();
model.addAttribute("date", date);
User username = userService.selectUserByName(user.getName());
if (username != null)
return "12";
else {
//
user.setSalt(UUID.randomUUID().toString().substring(0, 5));
//MD5加密
user.setPassword(Md5Util.getMd5(user.getPassword()));
System.out.println("MD5加密后的密码:" + user.getPassword());
// MD5加盐
user.setPassword(Md5Util.getMd5(user.getPassword() + user.getSalt()));
System.out.println("MD5加密后再加盐的密码 + 盐:" + "\n" + user.getPassword() + "\n" + user.getSalt());
userService.insert(user);
return "13";
}
}
user.setSalt(UUID.randomUUID().toString().substring(0, 5));
这行代码是网user实体里加入salt,从中可以看出salt是通过UUID的静态方法randomUUID来获得5位的随机字符串(若要使密码更加复杂,可以将随机字符串设置成更多位)
以下是注册后的控制台输出,我用了两次md5加密
数据库变化如下:密码都被加密,salt为5位随机字符串
接下来进行登录的验证,验证思路如下:
在登陆的时候可以先通过用户的账号(唯一标识)来获得该用户的salt,然后将用户的密码加上salt进行MD5加密,最后用加密的结果和数据库中保存的结果进行比较,若一样,则匹配成功,反之则不成功。
在之前的登录代码加入以下内容
user.setPassword(Md5Util.getMd5(user.getPassword()));System.out.println("MD5加密后的密码:" + user.getPassword());
User user2 = userService.selectUserByName(user.getName());
user.setPassword(Md5Util.getMd5(user2.getPassword() + user2.getSalt()));
System.out.println("MD5加密后再加盐的密码 + 盐:" + "\n" + user2.getPassword() + "\n" + user2.getSalt());
用name=21登录
控制台输出,可以看出密钥与注册的一样
刷新数据库,看见多了一个登录时间,登录成功
问题:
就是这个上面说的这个东西,没找到解决办法
java.net.SocketException: Software caused connection abort: recv failed
收获
初步学习拦截器,MD5加密
计划
任务5扫尾,准备小课堂
评论