SpringBoot使用redis实现token自动存储和设定过期时间

一、使用场景

当用户登录成功后,如果一段时间不去调用其他接口,就会返回token过期,请重新登录!!

二、代码实现

首先:通过用户名和密码判断用户是否登录成功,如果登录成功,就设置一个token和token过期时间放到缓存当中,这里设定的token过期时间为两分钟

public JSONObject getLogin(String userName,String password) {
        JSONObject result = new JSONObject();
        ValueOperations<String,Object> vo = redisTemplate.opsForValue();
        String token = String.valueOf(UUID.randomUUID());
        if(userName.equals("用户名") && password.equals("密码")){
            vo.set(token,userName,2, TimeUnit.MINUTES);
            result.put("userName",userName);
            result.put("token",token);
            result.put("resultCode", 200);
            result.put("resultMsg", "登录成功!");
        }else {
            result.put("resultCode", 500);
            result.put("resultMsg", "登录失败!");
        }
        return result;
    }

然后:给其他接口设置拦截器,告诉前端调用其他接口的时候需要带上登录接口返回的token在Header当中,如果缓存当中的值和前端所传的值是一样的,那么更新缓存当中的token,防止过期

package com.hhubrain.Interceptor;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
import java.util.concurrent.TimeUnit;


public class AuthInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            JSONObject result  = new JSONObject();
            result.put("returnCode",404);
            result.put("returnMsg","用户未登录,请登录后操作!");
            return false;
        }
        ValueOperations<String,Object> vo = redisTemplate.opsForValue();
        Object loginStatus = vo.get(token);
        if( Objects.isNull(loginStatus)){
            JSONObject result  = new JSONObject();
            result.put("returnCode",500);
            result.put("returnMsg","token已经过期,请重新登录");
            response.getWriter().print(result);
            return false;
        }
        redisTemplate.expire(token,2, TimeUnit.MINUTES);
        return true;
    }

}
package com.hhubrain.config;

import com.hhubrain.Interceptor.AuthInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class AuthConfig implements WebMvcConfigurer {
    @Bean
    public AuthInterceptor initAuthInterceptor(){
        return new AuthInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //addPathPatterns:哪些路径下的会被拦截 /api/getTest
        //excludePathPatterns:哪些路径下不会被拦截 /api/insertRedisTest
        registry.addInterceptor(initAuthInterceptor()).addPathPatterns("接口路径").excludePathPatterns("接口路径");
    }
}

最后:调用测试接口,Header当中带上token值

@GetMapping("/getTest")
    public String getTest() {
        return "通过token登录成功";
    }
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要在 Spring Boot 项目中添加 RedisSpring Mail 的依赖。 ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 然后,你需要在 application.properties 文件中配置 Redis 和 Mail 相关的属性。 ``` # Redis spring.redis.host=127.0.0.1 spring.redis.port=6379 # Mail spring.mail.host=smtp.gmail.com spring.mail.port=587 spring[email protected] spring.mail.password=your-email-password spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true ``` 接着,你需要创建一个 Redis 队列,用于存储待发送邮件的信息。可以使用 RedisTemplate 来操作 Redis 队列。 ``` @Autowired private RedisTemplate<String, Object> redisTemplate; public void sendEmail(String to, String subject, String content) { Email email = new Email(to, subject, content); redisTemplate.opsForList().leftPush("email_queue", email); } ``` 最后,你需要创建一个定时任务,从 Redis 队列中取出邮件信息,并使用 JavaMailSender 发送邮件。 ``` @Autowired private JavaMailSender javaMailSender; @Scheduled(fixedDelay = 1000) public void sendEmailFromQueue() { Email email = (Email) redisTemplate.opsForList().rightPop("email_queue"); if (email != null) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(email.getTo()); message.setSubject(email.getSubject()); message.setText(email.getContent()); javaMailSender.send(message); } } public class Email { private String to; private String subject; private String content; public Email(String to, String subject, String content) { this.to = to; this.subject = subject; this.content = content; } // getters and setters } ``` 这样,你就可以使用 Redis 自动发送邮件了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值