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