redis保存验证码登录验证码 ,有效期1分钟

功能描述

用户登录时,请求一个生产一个验证码,验证码生产后 保持到redis数据库中,有效时间为一分钟

功能图

点击获取验证码的按钮 开始生产验证码

查看redis数据库中的验证码信息,和有效时间

 key为 ip_yzm value为生产的验证码

在这里插入图片描述

功能代码

前台代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
var time = 60;
//开始定时
function showTime()
{
    	var but = $("input[type='button']");
    	but.attr("disabled",true);
   		but.val(""+time--+"秒后重新发送");
   
}
//停止计时
function stop()
{
	clearInterval(times); 
	var but = $("input[type='button']");
	but.val("获取验证码");
	but.attr("disabled",false);
}

var getYzm  = function(){
	time = 60;
	$.post("doYzm",null,function(data){
		if(data){
			 times = setInterval("showTime();",1000);
			 setTimeout("stop();",60*1000);
		}
	},"json")
}

</script>
</head>
<body>
<p>验证码过期测试</p>
<form action="/login" method="post">
	<input type="text" value="请输入用户名" name="username" /><br>
	<input  type="text" value="请输入密码" name="password"/><br>
	<input  type="text" name="yzm"/><input type="button" "getYzm()" value="获取验证码"> 
	<input type="submit" value="提交"> 
</form>
</body>
</html>

后台代码

@Controller
public class PageController {

	@Autowired
	@Qualifier("stringRedisTemplate")
	RedisTemplate<String,String> rt;
	
	@RequestMapping("/{page}")
	public String page(@PathVariable("page") String page) {
		return page;
	}
	
	//生产验证码 保持到redis数据库中,有效时间为一分钟
	@RequestMapping("/doYzm")
	@ResponseBody
	public boolean doYzm(HttpServletRequest req) {
		try {
			String ip = req.getRemoteAddr();
			String yzm = this.getYzm();
			System.out.println(yzm);
			ValueOperations forValue = rt.opsForValue();
			forValue.set(ip+"_yzm", yzm);
			rt.expire(ip+"_yzm", 60*1000, TimeUnit.MILLISECONDS);
			return true;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return false;
	}
	
	//校验验证码
	@RequestMapping("/login")
	@ResponseBody
	public String login(HttpServletRequest req,String yzm) {
		String ip = req.getRemoteAddr();
		ValueOperations<String, String> forValue = rt.opsForValue();
		String old_yzm = forValue.get(ip+"_yzm");
		if(old_yzm ==null)return "验证码不存在或者过期";
		else if(old_yzm.equals(yzm)) return "验证码正确";
		else return "验证码错误";
	}
	
	//验证码生产方法
	private String getYzm() {
		String yzm = "";
		for(int i=0;i<4;i++) {
			int int1 = new Random().nextInt(10);
			yzm+=int1;
		}
		return yzm;
		
	}
	
}

项目简单配置

spring.thymeleaf.prefix=classpath:/templates/page/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html

spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379

项目pom依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
您好!关于使用 Redis 实现验证码登录的问题,我可以为您提供一些指导。 首先,您可以使用 Redis 存储验证码和用户信息。验证码可以作为键值对存储,其中键为验证码的标识符,值为验证码本身和其过期时间。用户信息可以使用哈希表存储,其中键为用户标识符,值为用户的相关信息。 以下是一个示例的实现流程: 1. 生成验证码:当用户申请登录时,您可以生成一个随机的验证码,并将其存储到 Redis 中。您可以使用一个唯一的标识符作为键,值可以是验证码本身和其过期时间(例如,验证码有效期为5分钟)。 2. 发送验证码:您可以通过适当的方式(例如短信、邮件等)将验证码发送给用户。 3. 验证用户输入:当用户输入验证码时,您可以从 Redis 中获取相应验证码,并与用户输入进行比对。 4. 验证码过期处理:在用户输入验证码之前,您可以在 Redis 中检查验证码是否已过期。如果验证码已过期,则需要重新生成新的验证码。 5. 用户登录:如果用户输入的验证码与存储在 Redis 中的匹配,您可以将用户标识符与其相关信息存储到 Redis 中,以便后续验证用户登录状态。 请注意,以上只是一个简单的示例流程,具体实现会根据您的需求和系统架构而有所不同。另外,为了确保安全性,建议对用户输入进行合法性验证,并采取适当的安全措施,如限制验证码尝试次数、使用 HTTPS 等。 希望以上信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值