发表于: 2020-08-05 22:26:07

1 1224


修改拦截器

public class LoginInterceptor implements HandlerInterceptor {
@Autowired
       DesUtil desUtil;
       @Autowired
       UserService userService;

       /**
        * preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
        * preHandle的返回值为false的时候整个请求就结束了。
        * 如果preHandle的返回值为true,则会继续执行postHandleafterCompletion
        */
       private  static final Logger logger=LogManager.getLogger(LoginInterceptor.class);
       @Override
       public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//       logger.info("拦截器被调用");
           //判断请求中是否携带了token令牌,同时对token令牌进行验证。
           Cookie[] cookies=httpServletRequest.getCookies();
           if(cookies!=null&&cookies.length>0){
logger.info("开始遍历cookie");
               for (Cookie cookie: cookies) {
//判断cookie是否存储了token
                   if("token".equals(cookie.getName())){
//String token=cookie.getValue();
                       //因为在登录的过程中,使用DES对用户ID和登录时间加密,生成Token。所以现在将tokenDES解密
                       String token=desUtil.decrypt(cookie.getValue());
                       //将解密后的token值中的用户id提取出来,进行验证token有效性
                       int id= StringUtil.tool(token);
                       if(userService.findById(id)!=null){
//验证token有效,返回true继续向下执行
                           return true;
                       }
else {
logger.debug("验证失败,重新返回到登录界面");
                           String uri=httpServletRequest.getContextPath()+"/log/0";
                           httpServletRequest.getRequestDispatcher(uri).forward(httpServletRequest,httpServletResponse);
                           return false;
                       }

}
}
}
logger.debug("cookies不存在");
           String uri=httpServletRequest.getContextPath()+"/log/0";
           httpServletRequest.getRequestDispatcher(uri).forward(httpServletRequest,httpServletResponse);
           return false;
       }

//  postHandler : 进入Handler方法之后,返回ModelAndView之前执行,使用场景从ModelAndView参数出发,
       // 比如,将公用的模型数据在这里传入到视图,也可以统一指定显示的视图等;
       @Override
       public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

//   afterHandler : 在执行Handler完成后执行此方法,使用于统一的异常处理,统一的日志处理等;该方法将在整个请求完成之后执行,主要作用是用于清理资源。
       @Override
       public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}

修改COOKIE

//登陆
@RequestMapping(value "/login",method RequestMethod.POST)
public String checkLogin(Model model@Param("userName")String userName@Param("passWord")String passWord,
   HttpServletRequest requestHttpServletResponse response){
   User user=userService.checkLogin(userName,passWord);
  if(user!=null){
      logger.info(userName,passWord);
      logger.info("登陆成功");
      //使用DES对用户ID和登录时间加密,生成Token,放入Cookie中
      int id=user.getId();
      String token=id+"="+System.currentTimeMillis();
      try {
          desUtil.encrypt(token);
          Cookie cookie=new Cookie("token",token);
          //设置cookie的有效期,以秒为单位
          cookie.setMaxAge(0);
          //设置cookie的有效路径,比如把cookie的有效路径设为"/xdp",那么浏览器访问"xdp"目录下的web资源时,都会带上cookie
          cookie.setPath("/");
          logger.debug("cookie有效路径为"+cookie.getMaxAge()+"cookie的有效期为"+cookie.getMaxAge()+"cookie生成的名字为"+cookie.getName());
          //将生成的cookie发送给浏览器客户端
          response.addCookie(cookie);
      catch (Exception e) {
          e.printStackTrace();

      }
      return "redirect:/home" ;
  }else {
      logger.debug("用户不存在,请重新登录");
      return "redirect:/login/0";
  }
}

密码转换不对 修改加盐  

/**
* MD5加盐加密
*/
public static String generate(String passWord) {
   // 生成一个16位的随机数
   Random = new Random();
   StringBuilder sb = new StringBuilder(16);
   //public int nextInt(int n)该方法的作用是生成一个随机的int值,该值介于[0,n)的区间
   sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
   int len sb.length();
   //长度不满足16位,补0
   if (len 16) {
       for (int 016 leni++) {
           sb.append("0");
       }
   }
   // 生成最终的加密盐
   String salt sb.toString();
   //将这16位数字和密码相加,然后再获取MD5算法摘要
   passWord Md5Util.getMd5(passWord salt);
   //创建一个字符数组,长度位为48
   char[] cs = new char[48];
   for (int 048+= 3) {
       cs[ipassWord.charAt(2);
       char salt.charAt(3);
       cs[1c;
       cs[2passWord.charAt(1);
   }
   return new String(cs);
}


/**
* 验证加盐后是否和原文一致,校验密码是否正确
*/
public static boolean verify(String passWordString md5) {
   char[] cs1 = new char[32];
   char[] cs2 = new char[16];
   for (int 048+= 3) {
       cs1[2md5.charAt(i);
       cs1[1md5.charAt(2);
       cs2[3md5.charAt(1);
   }
   String salt = new String(cs2);
   return Md5Util.getMd5(passWord salt).equals(new String(cs1));
}

有bug还在改

明日计划 完成功能task5


返回列表 返回列表
评论

    分享到