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依赖
4.0.0 com.binfoo.www JavaStudy 1.0 com.google.guava guava 14.0.1 commons-lang commons-lang 2.6
5. 测试结果