Java用Session实现十天记住密码登录功能

该文展示了如何在Java中创建一个User实体类,以及实现登录拦截器以检查用户是否已登录。此外,文中详细说明了如何处理十天内记住密码的功能,包括在登录成功后设置Cookie,以及在用户退出登录时清除Cookie和Session。同时,还涵盖了登录失败的情况,如账号过期、锁定或IP受限。
实体类
@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:/";
    }
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值