发表于: 2018-03-04 23:47:03

2 647


完成

重写了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,看看是否有一个cookiename等于“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时,报错:

Root Cause
java.net.SocketException: Software caused connection abort: recv failed java.net.SocketInputStream.socketRead0(Native Method) java.net.SocketInputStream.socketRead(SocketInputStream.java:116) java.net.SocketInputStream.read(SocketInputStream.java:188) java.net.SocketInputStream.read(SocketInputStream.java:141)

百度了一下:产生这个异常的原因有多种方面,单就如 Software caused 所示,

是由于程序编写的问题,而不是网络的问题引起的.
已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.

这个时候就会出错 .

但是等一会又能打开,可能连接自动释放了,所以也变没有去解决这个问题


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(05));

这行代码是网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扫尾,准备小课堂


返回列表 返回列表
评论

    分享到