发表于: 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,则会继续执行postHandle和afterCompletion。
*/
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。所以现在将token用DES解密
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 request, HttpServletResponse 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 r = 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 i = 0; i < 16 - len; i++) {
sb.append("0");
}
}
// 生成最终的加密盐
String salt = sb.toString();
//将这16位数字和密码相加,然后再获取MD5算法摘要
passWord = Md5Util.getMd5(passWord + salt);
//创建一个字符数组,长度位为48
char[] cs = new char[48];
for (int i = 0; i < 48; i += 3) {
cs[i] = passWord.charAt(i / 3 * 2);
char c = salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = passWord.charAt(i / 3 * 2 + 1);
}
return new String(cs);
}
/**
* 验证加盐后是否和原文一致,校验密码是否正确
*/
public static boolean verify(String passWord, String md5) {
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for (int i = 0; i < 48; i += 3) {
cs1[i / 3 * 2] = md5.charAt(i);
cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
cs2[i / 3] = md5.charAt(i + 1);
}
String salt = new String(cs2);
return Md5Util.getMd5(passWord + salt).equals(new String(cs1));
}
有bug还在改
明日计划 完成功能task5
评论