javaweb验证码明明输入正确却还是提示错误,验证码session不同步、不一致问题

情况是,退出账号后,在登录界面输入验证码,有时验证码明明输入正确,却还是提示错误。
通过在Idea里debug调试发现,生成验证码之后将验证码赋予了sessionA,结果输入完四位验证码验证的时候,用来校验的session不是sessionA,而是sessionB,这是一个典型的session混乱问题。
经过调查,发现登录界面不只有获取验证码的接口,还有一个获取公告的接口,问题就是在这里了。
有时候呢,获取验证码的接口跑在了获取公告的接口的前头,那校验的时候后台就能获取到携带正确验证码的session,但是当获取公告的接口跑在了验证码的接口的前头,那校验的时候传送到后台的session就没有携带验证码,就会导致验证码校验失败。
哎,我的解决方法是为验证码加了一个onload事件,等验证码访问完了之后,才去访问公告接口。
当然也可以将验证码和公告全部写在一个接口里返回,朋友若有另外的方法,请提一下。

### 实现 JavaWeb 应用中的二次密码确认功能 #### 1. 引入必要的依赖库 为了实现二次密码确认功能,通常需要引入用于处理时间同的一次性密码算法(TOTP)的相关库。可以选择 `Google Authenticator` 的开源实现之一。 ```xml <dependency> <groupId>com.warrenstrange</groupId> <artifactId>googleauth</artifactId> <version>1.4.0</version> </dependency> ``` 此部分配置应添加至项目的 Maven POM 文件中以确保所需组件被正确加载[^1]。 #### 2. 创建密钥并生成二维码供用户扫描 当新用户注册或现有用户启用二验证时,服务端需创建唯一的 Base32 编码秘密字符串,并据此构建可用于手机应用扫描的 URI 形式的链接地址: ```java import com.warrenstrange.googleauth.GoogleAuthenticator; import com.warrenstrange.googleauth.GoogleAuthenticatorKey; public class TwoFactorSetup { private static final String ISSUER_NAME = "YourAppName"; public void setupUserSecret(User user) throws Exception { GoogleAuthenticator gAuth = new GoogleAuthenticator(); GoogleAuthenticatorKey key = gAuth.createCredentials(); // 将 secret 存储于数据库关联到特定账户上... String qrCodeUrl = generateQRBarcodeURL(user.getEmail(), key.getKey()); // 提供给前端显示给用户的 QR Code 图片 URL ... } private String generateQRBarcodeURL(String user, String secret) { return "https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=" + URLEncoder.encode("otpauth://totp/" + ISSUER_NAME + ":" + user + "?secret=" + secret, StandardCharsets.UTF_8.toString()); } } ``` 上述代码片段展示了如何初始化一个新的认证器实例以及怎样构造出适合移动设备读取的秘密令牌和对应的可视化表示形式。 #### 3. 录过程中加入额外的身份验证环节 一旦设置了两因素身份验证,在每次尝试录之后都需要请求用户提供由其安全应用程序产生的当前有效验证码来进行进一校验: ```java @RequestMapping(value="/login", method=RequestMethod.POST) public ModelAndView handleLogin(@RequestParam String email, @RequestParam String password, HttpSession session){ User user = userService.findByEmail(email); if (!passwordEncoder.matches(password, user.getPassword())) { throw new BadCredentialsException("Invalid credentials"); } else if (user.isTwoFactorEnabled()) { // 如果启用了双因子认证,则继续下一 boolean isValidToken = googleAuthenticator.authorize( user.getGoogleAuthSecret(), Integer.parseInt(request.getParameter("token")) ); if(!isValidToken){ throw new InvalidAuthenticationTokenException("Invalid token"); } // 验证成功后设置已通过状态标志位或其他方式标记已完成第二轮验证 session.setAttribute("authenticatedWith2FA", true); return modelAndViewForHomePage(); } else { // 对未开启双重验证的情况直接跳转主页或者其他逻辑分支 return modelAndViewForHomePageWithout2FA(); } } ``` 这段示例说明了在接收到表单提交的数据后,先执行常规的身份凭证匹配;对于那些已经激活了附加保护措施的目标对象而言,则紧接着发起针对一次性口令的有效性检查过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值