찾다

 >  Q&A  >  본문

android - 判断Token是否有效

  现在应用获取到的Token是这个结构:

  我使用了一个管理Token获取的类,在获取token之后的有效期内,直接将token存下来并提供其他类调用;然后根据有效期和外部调用的时间来判断是否需要再次申请新的Token。这个方法很直接而且也没出过什么问题。
  但是现在碰到一个情况,用户在这个类获取到token之后,手动改变了系统时间,比如说把系统时间往回调了一个小时,这样就导致判断token是否失效不准确了。
  虽然说这样的问题只是需要再次申请Token就够了,但是有没有一种源头上的方法在管理Token的类里面解决这种或者类似这种问题的?

PHPzPHPz2773일 전742

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:32:32

    1.

    所有 修改系统时间的问题都可以通过添加 nanoTime 验证来解决.

    System.nanoTime();

       /**
         * Returns the current timestamp of the most precise timer available on the
         * local system, in nanoseconds. Equivalent to Linux's {@code CLOCK_MONOTONIC}.
         *
         * <p>This timestamp should only be used to measure a duration by comparing it
         * against another timestamp on the same device.
         * Values returned by this method do not have a defined correspondence to
         * wall clock times; the zero value is typically whenever the device last booted.
         * Use {@link #currentTimeMillis} if you want to know what time it is.
         */
        public static native long nanoTime();
    

    注意nanoTime返回的不是UTC时间,是开机以后经过的时间.不受系统时间影响.

    2.

    在实际项目中,我现在的处理方案是,根本就不记录expires.
    在网络层会封装各种错误,token失效会触发一个401错误
    在错误分发器上,我主动拦截该错误并发起一个事件(REFRESH_TOKEN)

    用Event Dispatch框架(EventBus,otto之类的)在上层接受该事件,并把用户直接导向登录界面或弹出Alert确认框

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:32:32

    应以服务器时间为准 可以服务器端提供返回时间戳的接口

    회신하다
    0
  • 취소회신하다