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

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

  1. PHP小程序后端支付代码亲测可用

    小程序后端支付代码亲测可用 <?php namespace Home\Controller; use Think\Controller; class WechatpayController ex ...

  2. 亲测可用!!!golang如何在idea中保存时自动进行代码格式化

    亲测可用,golang在idea中的代码自动格式化 1.ctrl+alt+s打开设置界面,选择[Plugins] -> [Install JetBrains plugin...] -> 搜 ...

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

    近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...

  4. ArcGIS Desktop 10.1+ArcEngine10.1完全破解安装教程(含下载地址+亲测可用!)

    最近在二次开发中用到了VS2010+ArcGIS的二次开发模式,因为之前的某些原因,对ArcGIS的接触甚少.初次安装也遇到了很多问题,这里做一个总结. 系统环境 win732位操作系统 需要文件 ( ...

  5. JProfiler 9版本注册码(亲测可用!!!)

    JProfiler 9版本注册码(亲测可用!!!) 按默认选择“Single or evaluation license” ,Name 和 Company 随意填!!! JProfiler 9.2  ...

  6. C#.NET中对称和非对称加密、解密方法汇总--亲测可用

    C#.NET中对称和非对称加密.解密方法汇总--亲测可用   在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...

  7. 亲测可用!免费下载QQ音乐大部分资源!

    优化后亲测可用!免费下载QQ音乐大部分资源 通知 时间问题 博客园这边暂时停更要下载的去GitHub或者90盘 GitHub项目地址 https://github.com/TotoWang-hhh/m ...

  8. Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用]

    Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用] tip:只需要配置xml文件即可 1.第三方依赖包的引入 <properties> <project.bu ...

  9. IntelliJ IDEA2017 激活方法 最新的(亲测可用)

    IntelliJ IDEA2017 激活方法(亲测可用): 搭建自己的授权服务器,对大佬来说也很简单,我作为菜鸟就不说了,网上有教程. 我主要说第二种,现在,直接写入注册码,是不能成功激活的(如果你成 ...

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

    有时候你需要把同一个页面在手机和pc同时打开,其中有一个办法就是判断不同分辨路加载不同的css 小编总结了几种分别加载css的方法: 1.比较复杂的使用js判断加载不同css (亲测可用) 但是这种方 ...

随机推荐

  1. xcode7中使用cocos2d-x3.8的webview控件

    在XCode7中使用cocos2d-x 3.3以上版本的WebView控件时,碰到了编译错误 App Transport Security has blocked a cleartext HTTP ( ...

  2. 新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key

    新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD应用的Key 前篇讲过有一个面向公众的Runbook库,社区和微软一直往其中加入新的Runbook, ...

  3. window MySQL解压缩版部署及配置

    MySQL安装分为解压文件和直接安装.exe文件 我在官网下载的是解压文件 官网下载地址https://dev.mysql.com/downloads/mysql/ 一.MySQL部署 1.将下载下来 ...

  4. 谨慎升级到HTTPS

    我们的业务主要为两块,首先是h5商城,在商城里面会有很多很多的运营活动,点击进去是在后台配置的各种H5活动链接.而H5商城和运营活动是两个业务,两者的联系就是要在后台系统将运营活动的链接配置到商城中. ...

  5. 关于ssh登录出现异常警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    提示警告信息如下: arnold@WSN:~$ ssh 10.18.46.111 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  6. 分布式代码管理系统Git实践

    1.1 版本管理工具介绍   什么是版本管理工具   为什么要使用版本管理工具?   老板要求小明写一个可行性报告,当他写完给老板看后,结果--     Git简介   早先linux内核代码托管在B ...

  7. Filezilla Server日志文件

    Filezilla Server版本:0.9.41. Filezilla Server日志文件在软件安装目录下Logs目录下. 但Filezilla Server默认不开始日志记录,如何开启filez ...

  8. 在web工程中设置首页的页面

    有些时候删除了系统自带的index.jsp删除后会出现如下图错误 解决办法,新创建一个以你自己命名的jsp文件,然后在对该web工程的WEB-INF 目录下的web.xml进行添加加上下面的注释所带的 ...

  9. axios + mock.js模拟数据实现前后端分离开发的实例代码

    首先就是必须安装axios和mock.js npm install axios npm install mockjs 1. 然后在文档src中新建一个mock.js文件,如图 2. 在main.js中 ...

  10. 《android开发艺术探索》读书笔记(九)--四大组件

    接上篇<android开发艺术探索>读书笔记(八)--WindowManager No1: 四大组件除了BroadcastReceiver,其他三种组件都必须在AndroidManifes ...