一个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好[email protected]#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. 测试结果

时间: 2024-10-01 04:25:19

一个TokenUtils程序,亲测可用的相关文章

C# 32位程序,申请大内存,附dome(wpf),亲测可用

原文:C# 32位程序,申请大内存,附dome(wpf),亲测可用 1.我是vs2017,在选装vs的时候,需要安装c++模块,因为申请大内存的必要exe存放在vc的某个目录(下面会给出详细的地址)下的 2.安装完成在vs的安装目录可找到这个文件,我是社区版本的,如果是其他版本也差不多,给大家参照 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\

VCL下最好的皮肤控件AlphaControls 9.05 完美支持XE6 亲测可用

在传统的vcl编程中,因自带的控件效果太过普通,为了更好的用户体验和视觉效果往往会使用第三方的一些皮肤控件,这样的皮肤控件百度上一搜一大把,但往往不了解自己不使用过直接下载下来也是没有用的,因为这要涉及到控件版本 ID工具版本 操作系统 等多方因素配合使用,只有实际测试使用过才可定性. 本文提供的一款控件是经过实际测试过的 测试环境:Windows7 32位 ,Delphi xe6, AlphaControls 9.05 下载链接:http://binstyle.7958.com/down_18

[转]QT子线程与主线程的信号槽通信-亲测可用!

近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽通信的方式,但是并不完全适合线程间的信号槽通信,这主要体现在自定义消息的传递上. 首先我们看看一般的方式:利用信号-槽发送Qt内置的元数据类型testthread.h 文件 #ifndef TESTTHREAD_H #define TESTTHREAD_H #include <QThread> #

Apache+Php配置(亲测可用)

引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介绍: 一个Maven管理的Java项目,提供一个系统级别的POM.xml,其中定义了整个项目使用的类库. 需求: 需要添加一个自定义的类库到当前项目中.假定当前的类库文件名为:abc.jar.. 如何将类库添加进来? 1.  找到当前Maven的Repository类库位置 一般默认情况下,在win

CSS响应式:根据分辨路加载不同CSS的几个方法,亲测可用

有时候你需要把同一个页面在手机和pc同时打开,其中有一个办法就是判断不同分辨路加载不同的css 小编总结了几种分别加载css的方法: 1.比较复杂的使用js判断加载不同css (亲测可用) 但是这种方法只有最开始的时候会判断,如果你拖动浏览器大小是不会发生改变的(当然如果喜欢拖着玩的话) 1 <link rel="stylesheet" type="text/css" id="links" href="../css/m_wuqin

is 32-bit instead of 64-bit 亲测可用

亲测可用 来源:https://stackoverflow.com/questions/27186243/use-32-bit-jni-libraries-on-64-bit-android 解决方法: 1.将以下内容添加到"build.gradle"defaultConfig中:添加 ndk {abiFilters"armeabi","armeabi-v7a","x86","mips"} 2.将andro

AD10 Altium Designer 10 破解文件-亲测可用

做了9年多的软件,从BSP,嵌入式软件到系统软件,从vxwork到QNX到linux..从通信行业做到机器人行业...从基层开发工程师到软件经理,系统架构师... 35岁了,有娃有家了,开始兼管硬件部门了,心理感慨万千... 如今以一个新兵的心态去开始迎接底层最基础的硬件,从装Altium Designer.开始吧.. 装了AD10,在网上找了很多破解方案,都不行,,最后找到一个亲测可用的,连接如下: https://files.cnblogs.com/files/stay-foolish198

rtsp流 测试地址(亲测可用)

开发一款视频监控实时视频播放器,用到的协议是RTSP,由于在开发测试阶段所以没有用服务器的链接, 最后找到一个亲测可用: rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov (转) 作者:hou_tong 来源:CSDN 原文:https://blog.csdn.net/tong_hou/article/details/77532245?utm_source=copy 原文地址:https://www.cnblogs.com/yizhizhan

C#读取Excel设置(亲测可用)

OpenFileDialog openFD = new OpenFileDialog(); openFD.FileName = ""; openFD.Filter = "xls|*.xls|xlsx|*.xlsx"; openFD.Title = "选择更新文件"; openFD.Multiselect = false; if (openFD.ShowDialog() == DialogResult.OK) { this.tbSelectFile

sqlite 删除表中重复数据(亲测可用)

例子:表名  Paper .通过字段PaperID查找重复数据. 1 --查询某表中重复的数据       select * from Paper group by PaperID having count(*)>1; 2--删除重复行数,只剩不重复的记录(rowid为sqlite自带字段)      delete from Paper where Paper.rowid not in (select MAX(Paper.rowid) from Paper group by PaperID);