博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个TokenUtils程序,亲测可用
阅读量:5055 次
发布时间:2019-06-12

本文共 3657 字,大约阅读时间需要 12 分钟。

1. Token用途

token是HTTP请求的令牌,通俗一点说是凭证,目的是防止api被随意访问获取信息。

可使用随机数生成,也可以使用用户id、密码或时间之类进行排序或者加密进行声称。

token一般有个有效期,比如超过1个小时或者2个小时需要重新登录获取新的。

2. 程序原理

本程序token使用用户id和当前时间(精确到小时数)生成。

a.用户登陆后,服务器给客户端返回token数值;

b.客户端请求其他接口带上token

c.服务器对token进行有无和时间是否超时校验

d.校验通过进行业务处理,校验不通过通知客户端。

3. 相关代码

import com.google.common.base.Charsets;import com.google.common.hash.Hashing;import java.util.Date;import org.apache.commons.lang.time.FastDateFormat;/** * token在1到2小时之间都有效 */public class TokenUtils {    private static final String privateKey = "fdas34ljfr好sja@#8$%dfkl;js&4*daklfjsdl;akfjsa342";    public static String getToken(String userId, String date) {        return Hashing.md5().newHasher().                putString(userId, Charsets.UTF_8).                putString(privateKey, Charsets.UTF_8).                putString(date, Charsets.UTF_8).hash().toString();    }    public static String getToken(String userId, Date date) {        return Hashing.md5().newHasher().                putString(userId, Charsets.UTF_8).                putString(privateKey, Charsets.UTF_8).                putString(getDate(date), Charsets.UTF_8).hash().toString();    }    public static String getToken(String userId) {        return Hashing.md5().newHasher().                putString(userId, Charsets.UTF_8).                putString(privateKey, Charsets.UTF_8).putString(getDate(), Charsets.UTF_8).hash().toString();    }    /**     * 2个小时内都校验通过     *     * @param token     * @param userId     * @return     */    public static boolean validToken(String token, String userId) {        String confirm = getToken(userId);        String confirmNextHour = getToken(userId, getNextHour());        if (confirm.equals(token) || confirmNextHour.equals(token)) {            return true;        } else {            return false;        }    }    public static String getDate() {        Date date = new Date(System.currentTimeMillis());        return FastDateFormat.getInstance("yyyyMMddHH").format(date);    }    public static String getDate(Date now) {        return FastDateFormat.getInstance("yyyyMMddHH").format(now);    }    public static String getNextHour() {        Date date = new Date(System.currentTimeMillis() + 60 * 60 * 1000);        return FastDateFormat.getInstance("yyyyMMddHH").format(date);    }    public static String getNextHour(Date now) {        Date date = new Date(now.getTime() + 60 * 60 * 1000);        return FastDateFormat.getInstance("yyyyMMddHH").format(date);    }    public static void main(String[] args) {        Date now = new Date();        System.out.println("getToken(String userId, String date) : " + getToken("135", "2016061523"));        System.out.println(" String getToken(String userId) : " + getToken("135"));        System.out.println("String getDate() : " + getDate());        System.out.println(" String getDate(Date now) : " + getDate(now));        System.out.println("getNextHour(Date now) : " + getNextHour(now));        System.out.println("getNextHour() : " + getNextHour());        System.out.println("validToken(String token, String userId) : " + validToken("0dc01307bd76368628a2a0a4c3e65b61", "135"));    }}

 

4. Maven依赖

4.0.0
com.binfoo.www
JavaStudy
1.0
com.google.guava
guava
14.0.1
commons-lang
commons-lang
2.6

 

5. 测试结果

转载于:https://www.cnblogs.com/binfoo/p/5589274.html

你可能感兴趣的文章
[笔记]C#基础入门(十八)——C#中多重if结构
查看>>
Failed to write genesis block: database already contains an incompatible
查看>>
node——模块分类,require执行顺序,require注意事项,原理
查看>>
回发或回调参数无效的各种情况分析及解决办法
查看>>
第14周总结
查看>>
tomcat访问
查看>>
取消元件库里的元件等比例缩放
查看>>
unity中使用代理(翻译)
查看>>
openWRT自学---初始化过程和主要脚本的分析--转
查看>>
planning algorithms chapter 3
查看>>
HDU 1166 敌兵布阵 树状数组
查看>>
基于第三方开源库的OPC服务器开发指南(1)——OPC与DCOM
查看>>
PHP重要知识点
查看>>
伪静态例子与APACHE伪静态配置
查看>>
把ISO文件加载到虚拟光驱
查看>>
[区块链] 密码学——椭圆曲线密码算法(ECC)
查看>>
第6周学习进度
查看>>
数据库运行在非归档模式下,数据文件被误删的解决方法
查看>>
再要你命3K的任务总结
查看>>
小白学数据分析------>描述性统计术语汇总
查看>>