在之前我们学习了用户注册发送邮箱激活码的功能,但是邮箱激活码往往是有有效期的,这个功能我们可以使用redis实现:
1.redis的介绍:
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
其实简单的说redis就是本质上就是一个key-value数据库,比mysql,oracle简单很多,它是基于内存操作的,所以效率很高,读写操作达到10万次/s,是已知性能最快的Key-Value DB,并且可以存储多种数据结构,还能设置expire时间;我们可以从官网上下载redis的压缩包: http://redis.io/download
2.spring整合redis
1.在pom文件中引入依赖:
<!-- redis nosql 内存数据库 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
2.配置 applicationContext.xml 配置 redisTemplate
<!-- jedis 连接池配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="300" />
<property name="maxWaitMillis" value="3000" />
<property name="testOnBorrow" value="true" />
</bean>
<!-- jedis 连接工厂 -->
<bean id="redisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="localhost" p:port="6379" p:pool-config-ref="poolConfig"
p:database="0" />
<!-- spring data 提供 redis模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redisConnectionFactory" />
<!-- 如果不指定 Serializer -->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer">
</bean>
</property>
</bean>
为了方便,我们可以将redis的配置文件抽取出来,在applicationContext.xml中引入即可;
3.书写逻辑代码:
我们在 CustomerAction 提供发送邮件代码,邮件中生成激活码,激活码保存到 redis 中
需要注入RedisTemplate
@AutoWired
private RedisTemplate<String,String> redisTemplate;
将邮箱激活码保存在redis中,设置时间24小时:
// 发送一封激活邮件
// 生成激活码
String activecode = RandomStringUtils.randomNumeric(32);
// 将激活码保存到redis,设置24小时失效
redisTemplate.opsForValue().set(model.getTelephone(), activecode,24,TimeUnit.HOURS);
当用户激活邮件时,我们从redis中取出保存的activecode即可
// 判断激活码是否有效
String activecodeRedis = redisTemplate.opsForValue().get(
model.getTelephone());
if (activecodeRedis == null || !activecodeRedis.equals(activecodeRedis)) {
// 激活码无效
ServletActionContext.getResponse().getWriter().println("激活码无效,请登录系统,重新绑定邮箱!");