在拦截器内刷新token有效期

本文介绍了如何在SpringMVC的HandlerInterceptor中,通过RedisTemplate刷新token的有效期,确保用户在会话期间无需重新登录,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 token可用于标识用户,确认登录状态,一般都会给其设置一个有效期,为了避免出现用户还在网站上操作,而token过期,需要用户重新登录的乌龙事件出现,我们需要在客户端发请求的同时刷新token的有效期

redisTemplate.expire(token,60, TimeUnit.MINUTES);

 使用redisTemplate的expire函数便可刷新token的有效期,其中三个参数,第一个为token的名字,为String类型,第二个是持续时间,为Long类型,第三个是时间单位,可以是时分秒,为TimeUnit类型。

以下是一个案例。

public class TotalInterceptor implements HandlerInterceptor {
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){

        String token = request.getHeader("token");//获取请求头中的token

        if (token != null){//如果token不为空,表明用户为登录状态
              
            //在redis里查找该token,若找到,则说明此次请求合法
            //否则不合法,拒绝请求
            Object o = redisTemplate.opsForValue.get(token);
            if(o!=null){

                //更新 token 的有效时间
                redisTemplate.expire(token,60, TimeUnit.MINUTES);

                System.out.println("拦截器通过了你的请求");

                return true;

            }else{
                
                System.out.println("用户非法,拦截器拒绝请求");
                return false;

            }
        }
        else {//未携带token,用户未登录

            System.out.println("跳转登录页面");
            return false;

        }
    }

<think>好的,用户想修改token有效期,我需要根据他提供的引用和之前的回答来给出解决方案。首先,用户提到了三个引用,其中引用1提到access_token有效期是7200秒,引用2展示了前端如何控制token有效期,引用3是关于Java后端设置有效期的代码示例。 用户之前的问题是关于如何读取token,现在想修改有效期。我需要分前端和后端两种情况来考虑。根据引用2,前端可以在请求拦截器中检查token是否过期,比如设置TOKEN_LIVE_TIME。引用3展示了Java中如何通过Calendar类来设置时间,比如增加一年或一天。引用1提到access_token有效期两小时,需要定时刷新。 接下来需要确定用户是前端还是后端修改。如果是前端,可能需要调整TOKEN_LIVE_TIME的值,并处理自动刷新或重新登录的逻辑。如果是后端,比如使用JWT,需要修改生成token时的过期时间设置,或者使用类似Spring Security的配置。此外,还要考虑刷新令牌机制,让用户无需重新登录即可获取新token。 还要注意安全性,比如token有效期不宜过长,避免使用明文存储,以及刷新token时的权限验证。可能用户的应用场景不同,比如移动端可能需要长一些的有效期,而Web端则短一些。需要提醒用户根据实际需求调整,并给出最佳实践建议,如加密存储、定期刷新等。 最后,确保回答结构清晰,分点说明前后端的设置方法,并补充注意事项,帮助用户全面理解如何修改token有效期。同时,生成的相关问题要围绕token有效期的管理和安全性展开,帮助用户深入探索。</think># 关于Token有效期设置的技术解析 ## 一、有效期设置的核心逻辑 Token有效期设置需遵循`签发端配置`+`验证端校验`双重机制,典型流程如下: $$有效期时间 = 签发时间戳 + 设定时长$$ 验证时通过比较当前时间与过期时间戳: $$验证结果 = \begin{cases} 有效 & \text{当 } current\_time < expiration\_time \\ 无效 & \text{当 } current\_time \geq expiration\_time \end{cases}$$ ## 二、具体实现方案 ### (一) 后端签发配置 #### 1. JWT方式(推荐方案) ```java // 基于JJWT库的Java实现 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR, 2); // 设置2小时有效期 Date expiration = calendar.getTime(); String token = Jwts.builder() .setSubject("user123") .setExpiration(expiration) // 核心有效期配置 .signWith(SignatureAlgorithm.HS512, secretKey) .compact(); ``` *该方案通过RFC7519标准自动生成exp字段[^1]* #### 2. Spring Security方案 ```yaml # application.yml security: jwt: token: expire-length: 7200 # 单位秒 refresh-length: 2592000 # 30天刷新令牌 ``` ### (二) 前端校验逻辑 ```javascript // Vue.js示例(基于引用[2]优化) const TOKEN_VALIDITY = 2 * 60 * 60 * 1000; // 毫秒单位 axios.interceptors.request.use(config => { const issueTime = localStorage.getItem('token_issued_at'); if (Date.now() - issueTime > TOKEN_VALIDITY) { store.dispatch('refreshToken'); // 触发自动刷新 } return config; }); ``` ## 三、有效期修改注意事项 1. **安全边界控制**: - Web应用建议不超过24小时 - 移动端可延长至7天(需配合刷新令牌) - 敏感操作应缩短至10-30分钟 2. **双令牌机制示例**: ```mermaid graph LR A[访问令牌 2h] -->|过期| B[刷新令牌 30d] B --> C[获取新访问令牌] C --> D[更新客户端存储] ``` 3. **动态调整策略**: ```python # 根据风险等级动态调整有效期 def set_token_expiry(risk_level): base_time = 3600 # 1小时基准 risk_factors = { 'low': 2.0, 'medium': 1.0, 'high': 0.5 } return base_time * risk_factors.get(risk_level, 1.0) ``` ## 四、最佳实践建议 1. **时间同步机制**: - 强制使用NTP服务器时间同步 - 添加时间容差(推荐±300秒)应对时钟偏移 2. **安全增强措施**: - 加密存储本地时间戳(如使用AES-GCM) - 设置最大刷新次数(防暴力刷新) - 重要操作需二次认证(如支付令牌有效期<5分钟)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值