登陆三次失败锁定不给登陆

登陆三次失败锁定不给登陆。

这里主要的实现方式是数据库表+代码。当然这种方式适合练练手,还有一种更简便的就是用缓存实现,代码节省很多。

基本逻辑是登陆失败累计次数。三次抛出限制定语。

限定根据当前时间和数据库锁定时间进行判断是否解锁。

最后数据状态修改为0.

代码

public Yhxx getLogin(String userName, String pwd) throws ServiceException {
        Yhxx yh = yhxxMapper.getYhxxByUserName(userName);
        if (yh == null) {
            throw new ServiceException("P-1", "用户信息不存在!");
        }
        String yhDlm = yh.getYhDlm();
        if (StringUtils.isEmpty(yh)) {
            throw new ServiceException("P-1", "用户不存在!");
        }
        int num = 0;
        Yhdlxx yhdlxx = iYhdlxxMapper.findYhdlxxByUid(yh.getXxbm());
        if (!yh.getYhDlmm().equals(MD5Util.encode(pwd))) {
            //在数据表中建立数据记录,数据需要uid,错误的次数,锁定的时间。
            //不存在则记录
            if (yhdlxx == null) {
                yhdlxx = new Yhdlxx();
                yhdlxx.setUid(yh.getXxbm());
                yhdlxx.setFailurenum(1);
                iYhdlxxMapper.insterYhdlxx(yhdlxx);
            } else {
                if (yhdlxx.getFailurenum() == errorPasswordTimes) {
                    throw new ServiceException("P-1", "登陆密码输入错误" + errorPasswordTimes + "次,请稍后在重试!");
                }
                num = yhdlxx.getFailurenum() + 1;
                //存在则,登陆次数累计,到三次锁定,并加上锁定时间
                yhdlxx.setFailurenum(num);
                if (num == errorPasswordTimes) {
                    yhdlxx.setLocktime(new Date());
                }
                iYhdlxxMapper.updateYhdlxxByUid(yhdlxx);
                if (num == errorPasswordTimes) {
                    throw new ServiceException("P-1", "登陆密码输入错误" + errorPasswordTimes + "次,请(" + errorPasswordLockTime + ")分钟后在重试!");
                }
            }
            int i = errorPasswordTimes - yhdlxx.getFailurenum();
            throw new ServiceException("P-1", "密码错误!您还有" + i + "次机会!");
        }
        //根据锁定时间和当前时间得到之间的分钟数。
        if (yhdlxx != null && yhdlxx.getFailurenum() - errorPasswordTimes >= 0) {
            //LocalDateTime年月日十分秒;LocalDate日期;LocalTime时间
            long minutes = Duration.between(new Timestamp(yhdlxx.getLocktime().getTime()).toLocalDateTime(), LocalDateTime.now()).toMinutes();
            if (minutes - errorPasswordLockTime < 0) {
                throw new ServiceException("P-1", "登陆密码输入错误三次,请(" + (errorPasswordLockTime - minutes) + ")分钟后在重试!");
            }
        }
        //登陆成清除数据
        Yhdlxx yhdlxx1 = new Yhdlxx();
        String uid = yh.getXxbm();
        yhdlxx1.setUid(uid);
        yhdlxx1.setFailurenum(num);
        yhdlxx1.setLocktime(null);
        iYhdlxxMapper.updateYhdlxxByUid(yhdlxx1);
        return yh;
    }

数据库

仅供参考!

<think>好的,我现在需要帮助用户找到关于使用Python实现三次登录博客园功能的代码示例。用户之前提到过引用中有关于博客园登录的内容,特别是引用[1]和引用[2],所以应该先回顾这些引用。 首先,引用[1]提到了使用Cookie模拟登录博客园,但用户可能需要输入账号密码,而是直接使用Cookie。另外,引用中还提到登录时可能会有滑块验证码的问题,这可能需要用Selenium来处理。但用户的问题是实现三次登录尝试,所以可能需要结合重试机制。 接下来,引用[2]是关于爬虫的,可能和登录流程中的生产者消费者模式有关,但可能直接相关。过,用户需要的是三次登录的功能,所以重点应该在登录尝试的次数控制上。 用户的需求是实现三次登录功能,每次失败后提示剩余次数,三次失败锁定。但博客园的登录可能有验证码,所以在代码中需要考虑如何处理验证码的问题。根据引用[1],使用requests直接处理可能遇到滑块验证码,这时候可能需要Selenium来模拟人工操作,比如滑动验证。 所以,可能的解决思路是:使用Selenium打开登录页面,输入用户名密码,处理滑块验证,然后判断是否登录成功。如果成功则继续,否则记录失败次数,最多三次。 但用户可能希望有一个简化的示例,考虑到验证码处理可能比较复杂,可能需要先忽略验证码,或者模拟一个基本的登录流程,然后在三次失败后退出。 另外,引用[1]中提到,使用账号密码登录需要发送POST请求,但验证码是个障碍。所以示例代码可能需要分两种情况:一种是没有验证码的情况(可能太现实),另一种是处理验证码的情况,但处理验证码需要额外的步骤,比如使用Selenium。 综合考虑,可能需要编写一个使用Selenium的示例,包含三次重试,每次处理可能的验证码。但用户可能希望代码尽量简洁,所以可能需要先提供一个基础框架,说明如何处理登录尝试和次数限制。 还需要注意,用户可能需要保存cookies,以便在登录成功后进行后续操作,比如发布文章,但用户当前的问题主要是登录功能本身。 现在需要组织代码结构,使用循环控制三次尝试,每次尝试中输入用户名密码,处理验证码,检查是否登录成功。如果成功,跳出循环;否则,提示剩余次数。 由于滑块验证码处理比较复杂,可能需要提到这部分需要额外的方法,或者使用手动处理的方式,但在代码示例中可能暂时跳过,或者模拟处理。 最后,需要引用相关的引用内容,特别是引用[1]中关于登录POST请求和验证码的部分,以及引用[2]中可能的爬虫结构,但可能直接相关。 总结步骤: 1. 导入必要的库,如selenium, time。 2. 设置登录的URL、用户名和密码。 3. 循环三次尝试。 4. 每次尝试中打开浏览器,输入用户名密码,处理验证码(可能需要手动或自动)。 5. 检查登录是否成功,比如检查页面元素。 6. 根据成功与否,给出提示,并记录次数。 7. 三次失败锁定。 在代码示例中,处理验证码的部分可能需要注释说明,因为实际实现较复杂,引用[1]提到可能需要专门的解决方案,所以示例代码可能无法完全自动处理验证码,但可以展示基本流程。 此外,需要考虑代码的健壮性,比如异常处理,确保每次尝试后关闭浏览器,或者重用同一个浏览器实例。 最终,提供一个使用Selenium进行三次登录尝试的示例代码,并说明验证码处理的难点,参考引用[1]的内容。</think>根据博客园登录机制和Python实现需求,这里提供基于Selenium的三次登录功能实现示例。代码包含验证码处理提示和登录状态判断逻辑: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException import time MAX_ATTEMPTS = 3 # 最大尝试次数 LOGIN_URL = "https://passport.cnblogs.com/user/signin" USERNAME = "your_username" PASSWORD = "your_password" def check_login_success(driver): """检查是否登录成功[^1]""" try: driver.find_element(By.CLASS_NAME, 'avatar') return True except NoSuchElementException: return False def blog_login(): driver = webdriver.Chrome() driver.get(LOGIN_URL) for attempt in range(1, MAX_ATTEMPTS+1): try: # 输入登录凭证 driver.find_element(By.ID, 'mat-input-0').send_keys(USERNAME) driver.find_element(By.ID, 'mat-input-1').send_keys(PASSWORD) # 处理滑块验证码(需手动干预) print("请手动完成滑块验证...") time.sleep(20) # 预留人工操作时间 # 提交登录 driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click() time.sleep(3) if check_login_success(driver): print(f"第{attempt}次登录成功!") return driver # 返回已登录的driver对象 print(f"第{attempt}次登录失败,剩余尝试次数:{MAX_ATTEMPTS - attempt}") except Exception as e: print(f"异常错误:{str(e)}") continue driver.quit() print("三次登录失败,账号已锁定") return None if __name__ == "__main__": browser = blog_login() if browser: # 执行后续操作(如发布文章) browser.quit() ``` 关键实现要点: 1. 验证码处理:采用人工干预方式应对滑块验证[^1],通过`time.sleep(20)`预留操作时间 2. 登录状态验证:通过检测用户头像元素存在性判断登录状态 3. 异常处理机制:捕获元素查找异常和通用异常 4. 尝试次数控制:通过for循环实现三次尝试限制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值