实体类
@Data
public class User{
private String loginAct; //用户登录账户
private String loginPwd; //用户密码
}
设置登录拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
User user = (User) request.getSession().getAttribute(Contains.SESSION_USER);
if (user != null) {
//如果用户已经登录
return true;
}else {
//如果用户没有登录成功,则跳转到首页
//手动重定向时,url必须加项目的名称
response.sendRedirect(request.getContextPath());
return false;
}
}
}
实现十天记住密码的核心逻辑
/**
* @param loginAct 用户名
* @param loginPwd 密码
* @param isRemPwd 是否是十天记住密码,true表示是,false表示否
*/
@ResponseBody
public Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request, HttpSession session, HttpServletResponse response){
//封装参数
Map<String,Object> map = new HashMap();
map.put("loginAct",loginAct);
map.put("loginPwd",loginPwd);
//调用service层方法,根据用户名和密码查询用户
User user = userService.queryUserByLoginActAndPwd(map);
//封装返回信息
ReturnObject returnObject = new ReturnObject();
if (user != null) { //如果查询到结果
//进一步判断
//用户名或者密码错误,用户已过期,用户状态被锁定,ip受限 都不能登录成功
String nowTime = DateUtils.formateDateTime(new Date());
if (nowTime.compareTo(user.getExpireTime())>0) {
//账号过期,登录失败
returnObject.setCode(Contains.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("账号过期,登录失败");
}else if ("0".equals(user.getLockState())){
//账号被锁定,登录失败
returnObject.setMessage("账号被锁定,登录失败");
returnObject.setCode(Contains.RETURN_OBJECT_CODE_FAIL);
}else if(!user.getAllowIps().contains(request.getRemoteAddr())){
//ip受限,登录失败
returnObject.setCode(Contains.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("ip受限,登录失败");
}else {
//登录成功之后,所有业务页面显示当前用户的名称
session.setAttribute(Contains.SESSION_USER,user);
//如果需要记住密码,则往外写cookie
if ("true".equals(isRemPwd)) {
//写两个cookie,一个保存账号,一个保存密码
Cookie act = new Cookie("loginAct", user.getLoginAct());
act.setMaxAge(10*24*60*60);
Cookie pwd = new Cookie("loginPwd", user.getLoginPwd());
pwd.setMaxAge(10*24*60*60);
response.addCookie(act);
response.addCookie(pwd);
}else {
//删除cookie
Cookie act = new Cookie("loginAct", "1");
act.setMaxAge(0);
Cookie pwd = new Cookie("loginPwd", "1");
pwd.setMaxAge(0);
response.addCookie(act);
response.addCookie(pwd);
}
//登录成功之后,跳转到业务主页面
returnObject.setCode(Contains.RETURN_OBJECT_CODE_SUCCESS);
}
}else {
//登录失败,用户名或密码错误
returnObject.setCode(Contains.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("用户名或密码错误");
}
return returnObject;
}
退出登录功能
public String logout(HttpServletResponse response,HttpSession session){
//退出登录,清空cookie
Cookie act = new Cookie("loginAct", "1");
act.setMaxAge(0);
Cookie pwd = new Cookie("loginPwd", "1");
pwd.setMaxAge(0);
response.addCookie(act);
response.addCookie(pwd);
//销毁session
session.invalidate();
//跳转到首页
return "redirect:/";
}
该文展示了如何在Java中创建一个User实体类,以及实现登录拦截器以检查用户是否已登录。此外,文中详细说明了如何处理十天内记住密码的功能,包括在登录成功后设置Cookie,以及在用户退出登录时清除Cookie和Session。同时,还涵盖了登录失败的情况,如账号过期、锁定或IP受限。





