一个TokenUtils程序,亲测可用

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依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.binfoo.www</groupId>
    <artifactId>JavaStudy</artifactId>
    <version>1.0</version>
<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>14.0.1</version>
    </dependency>
    <!-- http://mvnrepository.com/artifact/commons-lang/commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

</dependencies>

</project>

 

5. 测试结果

posted @ 2016-06-15 22:26  binfoo  阅读(776)  评论(0编辑  收藏  举报