• 一个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. 测试结果

  • 相关阅读:
    [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治
    [loj6038]「雅礼集训 2017 Day5」远行 lct+并查集
    [BZOJ4945][Noi2017]游戏 2-sat
    [BZOJ4942][Noi2017]整数 线段树+压位
    [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治
    12.17模拟赛
    [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元
    杜教筛
    Swagger展示枚举类型参数
    spring boot 如何映射json格式请求中的枚举值
  • 原文地址:https://www.cnblogs.com/binfoo/p/5589274.html
Copyright © 2020-2023  润新知