token存进redis并设置当天结束时失效

2 篇文章 0 订阅
1 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


场景

调用第三方接口时的token当天有效,所以将token存进redis要设置当天结束时失效。


一、步骤

1.获取当天结束时间方法

DateUtils.java中新建方法
设置时间为当天的23点59分59秒999毫秒
代码如下:

/*
     * 获取当前天的结束时间
     */
    public static Date getEndTime(Date date) {
        Calendar day = Calendar.getInstance();
        day.setTime(date);
        day.set(Calendar.HOUR_OF_DAY, 23);
        day.set(Calendar.MINUTE, 59);
        day.set(Calendar.SECOND, 59);
        day.set(Calendar.MILLISECOND, 999);
        return day.getTime();
    }

2.时间距离当天结束时间的秒方法

DateUtils.java中新建方法
代码如下:

/**
     * 时间距离当天结束时间的秒
     *
     * @param nowDate
     * @return
     */
    public static long getDayEndSecond(Date nowDate) {

        // 获得两个时间的毫秒时间差异
        long diff = DateUtils.getEndTime(new Date()).getTime() - nowDate.getTime();
        //计算两个时间之间差了多少秒
        long second = diff / 1000;
        return second;
    }

3.存进redis

代码如下:

redisUtils.set("tokenByJy",(String)tokenMap.get("sc"), DateUtils.getDayEndSecond(new Date()));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用拦截器(Interceptor)或过滤器(Filter)来实现在调用接口前和调用接口后的一些操作,比如检查token是否失效或过期,自动刷新token并存入Redis。 以下是一个基本的实现过程: 1. 编写拦截器或过滤器,在调用接口前和调用接口后进行操作。 2. 在调用接口前,从Redis中获取token,并检查token是否失效或过期。 3. 如果token失效或过期,则根据刷新token的接口重新获取新的token,并将新的token存入Redis。 4. 在调用接口,将新的token传递给接口。 下面是一个简单的实现示例: ```java public class TokenInterceptor implements HandlerInterceptor { @Autowired private RedisTemplate<String, String> redisTemplate; @Value("${token.expireTime}") private long expireTime; @Value("${token.refreshUrl}") private String refreshUrl; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 从请求头中获取token String token = request.getHeader("token"); if (StringUtils.isEmpty(token)) { throw new RuntimeException("token不能为空"); } // 从Redis中获取token对应的value值 String value = redisTemplate.opsForValue().get(token); if (StringUtils.isEmpty(value)) { throw new RuntimeException("token失效,请重新登录"); } // 检查token是否过期 long expire = redisTemplate.getExpire(token, TimeUnit.SECONDS); if (expire <= 0) { // token已过期,重新获取并存入Redis String refreshedToken = refresh(token); redisTemplate.opsForValue().set(refreshedToken, value, expireTime, TimeUnit.SECONDS); redisTemplate.delete(token); // 将新的token传递给接口 request.setAttribute("token", refreshedToken); } else { // 将token传递给接口 request.setAttribute("token", token); } return true; } private String refresh(String token) { // 调用刷新token的接口,获取新的token String refreshedToken = restTemplate.getForObject(refreshUrl + "?token=" + token, String.class); if (StringUtils.isEmpty(refreshedToken)) { throw new RuntimeException("刷新token失败"); } return refreshedToken; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // do nothing } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // do nothing } } ``` 在上面的代码中,我们定义了一个TokenInterceptor拦截器,并实现了preHandle方法,在该方法中进行了token的检查和刷新操作。 我们使用了Spring的RedisTemplate来操作Redis,其中expireTime和refreshUrl是从配置文件中读取的参数。如果token失效或过期,则调用refresh方法获取新的token,并将新的token存入Redis中,同将新的token传递给接口。 我们还可以在配置文件中配置该拦截器: ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor).addPathPatterns("/**"); } } ``` 这样,当我们调用接口TokenInterceptor拦截器会自动检查token并刷新token,确保我们的接口调用是有效的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值