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

一个TokenUtils程序,亲测可用的更多相关文章
- PHP小程序后端支付代码亲测可用
小程序后端支付代码亲测可用 <?php namespace Home\Controller; use Think\Controller; class WechatpayController ex ...
- 亲测可用!!!golang如何在idea中保存时自动进行代码格式化
亲测可用,golang在idea中的代码自动格式化 1.ctrl+alt+s打开设置界面,选择[Plugins] -> [Install JetBrains plugin...] -> 搜 ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- ArcGIS Desktop 10.1+ArcEngine10.1完全破解安装教程(含下载地址+亲测可用!)
最近在二次开发中用到了VS2010+ArcGIS的二次开发模式,因为之前的某些原因,对ArcGIS的接触甚少.初次安装也遇到了很多问题,这里做一个总结. 系统环境 win732位操作系统 需要文件 ( ...
- JProfiler 9版本注册码(亲测可用!!!)
JProfiler 9版本注册码(亲测可用!!!) 按默认选择“Single or evaluation license” ,Name 和 Company 随意填!!! JProfiler 9.2 ...
- C#.NET中对称和非对称加密、解密方法汇总--亲测可用
C#.NET中对称和非对称加密.解密方法汇总--亲测可用 在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...
- 亲测可用!免费下载QQ音乐大部分资源!
优化后亲测可用!免费下载QQ音乐大部分资源 通知 时间问题 博客园这边暂时停更要下载的去GitHub或者90盘 GitHub项目地址 https://github.com/TotoWang-hhh/m ...
- Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用]
Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用] tip:只需要配置xml文件即可 1.第三方依赖包的引入 <properties> <project.bu ...
- IntelliJ IDEA2017 激活方法 最新的(亲测可用)
IntelliJ IDEA2017 激活方法(亲测可用): 搭建自己的授权服务器,对大佬来说也很简单,我作为菜鸟就不说了,网上有教程. 我主要说第二种,现在,直接写入注册码,是不能成功激活的(如果你成 ...
- CSS响应式:根据分辨率加载不同CSS的几个方法,亲测可用
有时候你需要把同一个页面在手机和pc同时打开,其中有一个办法就是判断不同分辨路加载不同的css 小编总结了几种分别加载css的方法: 1.比较复杂的使用js判断加载不同css (亲测可用) 但是这种方 ...
随机推荐
- 树莓派小车(三)Python控制小车
正文之前 由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享. 正文 在树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种: PHYSICAL N ...
- IDEA设置优化
默认会开很多的功能,但是有些功能暂时用不到,于是想屏蔽掉. Duplicated Code冗余代码提示功能 先找到设置路径Settings -> Editor -> Inspections ...
- [bzoj4551][Tjoi2016&Heoi2016]树-树链剖分
Brief Description 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.) ...
- 阿里云Aliyun_server
一.云概念 云主机是基于云计算平台的一种虚拟的主机服务器产品 云服务器(99.999%安全性,扩展性) 特点: 1.资源分配配置灵活,安全性能强. 2.优于VPS和独立服务器产品.通俗的理解: 云主机 ...
- ireport报表学习
常用组件介绍: 制作一个报表一般四个组件比较常用,下面分别介绍 Rectangle:用于画表格的样式,整个表格的样式使用次组件做出来的,本控件表现为一个黑色矩形框,多个黑色矩形框排在一起可以组合出来任 ...
- Java经典编程题50道之十五
输入三个整数x,y,z,请把这三个数由小到大输出. public class Example15 { public static void main(String[] args) { ...
- 高性能javascript笔记
----------------------------------------------------------- 第一章 加载和执行 ------------------------------ ...
- 转:【web前端开发】浏览器兼容性处理大全
解决思路: ①.写代码的时候遵循W3C标准,按照最新稳定版本的IE或WebKit内核浏览器进行编码 ②.遇到部分无法全面解决浏览器兼容的时候,采取CSS的hack手段进行针对性微调.简单的说,CSS ...
- hdu1251 map水过
更快的方法应该是字典树,不用处理前缀. AC代码: #include<iostream> #include<cstring> #include<string> #i ...
- APP性能测试(电量)
#encoding:utf-8 import csv import os import time #控制类 class Controller(object): def __init__(self, c ...