项目中使token
/**
*实体类
*/
public class User {
private Integer id;//主键id
private String userCode;//若是第三方登录,系统将自动生成唯一账号;自注册用户则为邮箱或者手机号
private String userPassword;//若是第三方登录,系统将自动生成唯一密码;自注册用户则为自定义密码
private String userType;//用户类型(标识:0 自注册用户 1 微信登录 2 QQ登录 3 微博登录)
private String flatId;//平台ID(根据不同登录用户,进行相应存入:自注册用户主键ID、微信ID、QQID、微博ID)
private Integer activated;//是否激活(0:否 1:是)
public Integer getId() {
return id;
} public Integer getActivated() {
return activated;
} public void setActivated(Integer activated) {
this.activated = activated;
} public void setId(Integer id) {
this.id = id;
} public String getUserCode() {
return userCode;
} public void setUserCode(String userCode) {
this.userCode = userCode;
} public String getUserPassword() {
return userPassword;
} public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
} public String getUserType() {
return userType;
} public void setUserType(String userType) {
this.userType = userType;
} public String getFlatId() {
return flatId;
} public void setFlatId(String flatId) {
this.flatId = flatId;
}
package com.kgc.utils.common;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random; public class MD5 { public static String getMd5(String plainText,int length) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest(); int i; StringBuffer buf = new StringBuffer("");
for (int offset = ; offset < b.length; offset++) {
i = b[offset];
if (i < ) {
i += ;
}
if (i < ) {
buf.append("");
}
buf.append(Integer.toHexString(i));
}
// 32位
// return buf.toString();
// 16位
// return buf.toString().substring(0, 16); return buf.toString().substring(, length);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
} } public static int getRandomCode(){
int max=;
int min=;
Random random = new Random();
return random.nextInt(max)%(max-min+) + min;
}
public static void main(String[] args) {
System.out.println(MD5.getMd5("helloadsfdsffsf",));
System.out.println(getRandomCode());
} }
/**
* 生成token
*
* @param User
* @param userAgent 判断是移动端还是PC端
需要controller传入 HttpServletRequest request
String userAgent = request.getHeader("user-agent");
* @return
*/
public String createToken(User ser, String userAgent) throws IOException {
StringBuffer token=new StringBuffer();
token.append("token:");
UserAgentInfo userAgentInfo = UserAgentUtil.getUasParser().parse(userAgent);
//获取访问设备并拼接
if(userAgentInfo.getDeviceType().equals(UserAgentInfo.UNKNOWN)){
if(UserAgentUtil.CheckAgent(userAgent)){
token.append("MOBILE-");
}else {
token.append("PC-");
}
}else if(userAgentInfo.getDeviceType().equals("Personal computer")){
token.append("PC-");
}else {
token.append("MOBILE-");
}
token.append(MD5.getMd5(ser.getUserCode(),)+"-");
token.append(user.getId()+"-");
token.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+"-");
token.append(MD5.getMd5(userAgent,)); return token.toString();
}
@RequestMapping(value = "/api")
@RestController
public class LoginController { @Resource
private TokenService tokenService; /**
* 用户登录
*
* @param name
* @param password
* @return
*/
@RequestMapping(value = "/dologin", method = RequestMethod.POST, produces = "application/json")
public Dto dologin(@RequestParam(value = "name") String name,
@RequestParam(value = "password") String password, HttpServletRequest request) {
try {
String userAgent = request.getHeader("user-agent");
return tokenService.dologin(name, password,userAgent);
} catch (Exception e) {
e.printStackTrace();
return DtoUtil.returnFail("系统异常", ErrorCode.AUTH_UNKNOWN);
}
}
public interface TokenService {
/**
* 会话时间
*/
public final static int SESSION_TIMEOUT=**;
/**
* 置换保护时间
*/
public final static int REPLACETOKEN_PROTECTION_TIMEOUT=*;
/**
* 旧的token延迟时间
*/
public final static int REPLACE=*;
//用户登录
public Dto dologin(String userCode, String userPassword,String userAgent) throws Exception; //用户注销
public Dto logout(String token) throws Exception; //客户端置换token
public Dto replacetoken(String token,String userAgent) throws Exception; }
@Service("LoginService")
public class TokenServerImpl implements TokenService {
@Resource
private UserMapper UserMapper;
@Resource
private RedisAPI redisAPI; /**
* 登录业务
*
* @param userCode
* @param userPassword
* @return
* @throws Exception
*/
@Override
public Dto dologin(String userCode, String userPassword, String userAgent) throws Exception {
Map<String, Object> userMap = new HashMap<>();
userMap.put("userCode", userCode);
user user = userMapper.getListByMap(userMap).get();
//用户是否存在
if (EmptyUtils.isNotEmpty(user)) {
//判断用户密码是否正确
if (DigestUtil.hmacSign(userPassword, "kgc").equals(user.getUserPassword())) {
String tokenString = createToken(user, userAgent);
//存到缓存服务器中
redisAPI.set(tokenString, JSONObject.toJSONString(user));
System.out.println("tokenString=="+tokenString);
//返回给前端
TokenVO tokenVO = new TokenVO(tokenString, Calendar.getInstance().getTimeInMillis() + SESSION_TIMEOUT * , Calendar.getInstance().getTimeInMillis());
return DtoUtil.returnDataSuccess(tokenVO);
} else {
return DtoUtil.returnFail("用户密码错误", ErrorCode.AUTH_PARAMETER_ERROR);
}
} else {
return DtoUtil.returnFail("用户不存在", ErrorCode.AUTH_USER_ALREADY_NOTEXISTS);
} } @Override
public Dto logout(String token) throws Exception {
//删除服务端
redisAPI.del(token);
return DtoUtil.returnSuccess();
} /**
* 客户端置换token
* @param token
* @return
* @throws Exception
*/
@Override
public Dto replacetoken(String token,String userAgent) throws Exception {
//判断token是否存在
if (!redisAPI.exists(token)){
return DtoUtil.returnFail("token不存在",ErrorCode.AUTH_TOKEN_INVALID);
}
String [] tokens=token.split("-");
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMssHHmmss");
Date startDate=simpleDateFormat.parse(tokens[]);
String format=simpleDateFormat.format(new Date());
long logtime=simpleDateFormat.parse(format).getTime()-startDate.getTime();
if (logtime<REPLACETOKEN_PROTECTION_TIMEOUT*){
return DtoUtil.returnFail("token处于保护时间,禁止替换",ErrorCode.AUTH_REPLACEMENT_FAILED);
}
//以上情况都符合
User user=JSON.parseObject(redisAPI.get(token),User.class);
//生成新的token
String newtoken=createToken(user,userAgent);
//覆盖新的请求,减少过期时间
redisAPI.set(token,JSONObject.toJSONString(user),REPLACE);
redisAPI.set(newtoken,JSONObject.toJSONString(user),SESSION_TIMEOUT);
//返回给前端
TokenVO tokenVO = new TokenVO(newtoken, Calendar.getInstance().getTimeInMillis() + SESSION_TIMEOUT * , Calendar.getInstance().getTimeInMillis()); return DtoUtil.returnDataSuccess(tokenVO);
} /**
* 生成token
*
* @param User
* @param userAgent 判断是移动端还是PC端
* @return
*/
public String createToken(User user, String userAgent) throws IOException {
StringBuffer token=new StringBuffer();
token.append("token:");
UserAgentInfo userAgentInfo = UserAgentUtil.getUasParser().parse(userAgent);
//获取访问设备并拼接
if(userAgentInfo.getDeviceType().equals(UserAgentInfo.UNKNOWN)){
if(UserAgentUtil.CheckAgent(userAgent)){
token.append("MOBILE-");
}else {
token.append("PC-");
}
}else if(userAgentInfo.getDeviceType().equals("Personal computer")){
token.append("PC-");
}else {
token.append("MOBILE-");
}
token.append(MD5.getMd5(user.getUserCode(),)+"-");
token.append(user.getId()+"-");
token.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+"-");
token.append(MD5.getMd5(userAgent,)); return token.toString();
}
}
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; import javax.annotation.Resource; @Component
public class RedisAPI {
@Resource
private JedisPool jedisPool; /**
* 以键值对的方式保存数据到redis
*
* @param key
* @param value
*/
public void set(String key, String value) {
//获取连接
Jedis jedis = jedisPool.getResource();
try {
String result = jedis.set(key, value);
// 资源还回到连接池当中
//返还到连接池
jedisPool.returnResource(jedis); } catch (Exception e) {
e.printStackTrace();
//销毁资源
jedisPool.returnBrokenResource(jedis); }
} /**
* 以键值对的方式保存数据到redis
*
* @param key
* @param value
* @param expire 时间 单位[秒]
*/
public void set(String key, String value, int expire) {
//获取连接
Jedis jedis = jedisPool.getResource();
try {
String result = jedis.setex(key, expire, value);
// 资源还回到连接池当中
jedisPool.returnResource(jedis);
} catch (Exception e) {
e.printStackTrace();
//销毁资源
jedisPool.returnBrokenResource(jedis);
}
} /**
* 取值
*
* @param key
*/
public String get(String key) {
//获取连接
Jedis jedis = jedisPool.getResource();
try {
String result = jedis.get(key);
// 资源还回到连接池当中
jedisPool.returnResource(jedis);
return result;
} catch (Exception e) {
e.printStackTrace();
//销毁资源
jedisPool.returnBrokenResource(jedis);
return null;
}
} /**
* 获取剩余秒数
*
* @param key
*/
public Long ttl(String key) {
//获取连接
Jedis jedis = jedisPool.getResource();
try {
Long result = jedis.ttl(key);
// 资源还回到连接池当中
jedisPool.returnResource(jedis);
return result;
} catch (Exception e) {
e.printStackTrace();
//销毁资源
jedisPool.returnBrokenResource(jedis);
return null;
}
} /**
* 判断key是否存在
*
* @param key
*/
public Boolean exists(String key) {
//获取连接
Jedis jedis = jedisPool.getResource();
try {
System.out.println("key=========="+key);
Boolean result = jedis.exists(key);
// 资源还回到连接池当中 jedisPool.returnResource(jedis);
return result;
} catch (Exception e) {
e.printStackTrace();
//销毁资源
jedisPool.returnBrokenResource(jedis);
return false;
}
} /**
* 删除
*
* @param key
*/
public Long del(String key) {
//获取连接
Jedis jedis = jedisPool.getResource();
try {
Long result = jedis.del(key);
// 资源还回到连接池当中
jedisPool.returnResource(jedis);
return result;
} catch (Exception e) {
e.printStackTrace();
//销毁资源
jedisPool.returnBrokenResource(jedis);
return null;
}
}
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; @ApiModel(value ="TokenVO",description = "用户认证凭证信息")
public class TokenVO {
@ApiModelProperty("用户认证凭据")
private String token;
@ApiModelProperty("过期时间,单位:毫秒")
private long expTime;
@ApiModelProperty("生成时间,单位:毫秒")
private long genTime; public TokenVO() {
} public TokenVO(String token, long expTime, long genTime) {
this.token = token;
this.expTime = expTime;
this.genTime = genTime;
} public String getToken() {
return token;
} public void setToken(String token) {
this.token = token;
} public long getExpTime() {
return expTime;
} public void setExpTime(long expTime) {
this.expTime = expTime;
} public long getGenTime() {
return genTime;
} public void setGenTime(long genTime) {
this.genTime = genTime;
}
}
/**
* Token验证
*
*/
@Component
public class ValidationToken { private Logger logger = Logger.getLogger(ValidationToken.class); private @Resource
RedisAPI redisAPI; public RedisAPI getRedisAPI() {
return redisAPI;
}
public void setRedisAPI(RedisAPI redisAPI) {
this.redisAPI = redisAPI;
}
public ser getCurrentUser(String tokenString){
//根据token从redis中获取用户信息
/*
test token:
key : token:1qaz2wsx
value : {"id":"100078","userCode":"myusercode","userPassword":"78ujsdlkfjoiiewe98r3ejrf","userType":"1","flatID":"10008989"} */
User ser = null;
if(null == tokenString || "".equals(tokenString)){
return null;
}
try{
String userInfoJson = redisAPI.get(tokenString);
ser = JSONObject.parseObject(userInfoJson,User.class);
}catch(Exception e){
ser = null;
logger.error("get userinfo from redis but is error : " + e.getMessage());
}
return ser;
} }
项目中使token的更多相关文章
- flask项目中使用富文本编辑器
flask是一个用python编写的轻量级web框架,基于Werkzeug WSGI(WSGI: python的服务器网关接口)工具箱和Jinja2模板,因为它使用简单的核心,用extension增加 ...
- MUI在项目中使用时遇到的问题的个人分享
picker 添加年插件问题总结 1. 取消按钮点击事件无法获取 可以获取到取消按钮标签和确定按钮标签 但是只能获取去顶按钮事件,取消点击事件无法获取 通过判断picker的display状态也不能确 ...
- My97DatePicker时间控件在项目中的应用
一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...
- 在Android项目中启用Java 8的部分特性--Lambda & Method References
Android N发布时同时发布了一个新的编译工具Jack(AS2.1+支持),基于Jack我们可以使用Java 8 的部分特性,在低版本机器上能使用的更少,同时Jack也有诸多不完善,工具链的改变难 ...
- 分享我在 vue 项目中关于 api 请求的一些实现及项目框架
本文主要简单分享以下四点 如何使用 axios 如何隔离配置 如何模拟数据 分享自己的项目框架 本文主要目的为以下三点 希望能够帮到一些人 希望能够得到一些建议 奉上一个使用Vue的模板框架 我只是把 ...
- DDD实战11 在项目中使用JWT的token 进行授权验证
步骤: 1.首先要在webapi的管道中 使用认证(Authentication) 2.要在webapi的服务中注册验证条件 代码如下: namespace Dealer.WebApi { publi ...
- ARC 与非ARC 之间的转换,以及如何使一个项目中,ARC与非ARC共存
1,非ARC 转 ARC的操作 XCode 的 Edit -- Refactor -- Convert to Object-C ARC (注意,一般在一个大项目中,很少直接使用此方法,其正确率有待考虑 ...
- vue项目中设置全局引入scss,使每个组件都可以使用变量
在Vue项目中使用scss,如果写了一套完整的有变量的scss文件.那么就需要全局引入,这样在每个组件中使用. 可以在mian.js全局引入,下面是使用方法. 1: 安装node-sass.sass- ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- javasctipt之DOM知识点
一:DOM节点 子节点:childNodes 父节点:parentNode offsetPrent 二:元素属性操作 方式一:xxx.style.xxx 方式二:xxx.style["xxx ...
- 红帽Linux故障定位技术详解与实例(4)
红帽Linux故障定位技术详解与实例(4) 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行 ...
- linux命令详解之ls命令
ls命令概述 ls命令用于显示文件目录列表,和Windows系统下DOS命令dir类似.当执行ls命令时,默认显示的只有非隐藏文件的文件名.以文件名进行排序及文件名代表的颜色显示.当不加参数时,默认列 ...
- 记Springcloud Config Service整合gitlab一坑
spring.cloud.config.server.git.uri=http://ip/***/configserver.git必须加上.git
- Java架构师面试题——JVM性能调优
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- jquery设置css属性几种方式
用css()方法返回元素的样式属性 $("div").css("padding-left")); 用css()设置样式 $("div").c ...
- POJ 6621: K-th Closest Distance(主席树 + 二分)
K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others) Memory Limit: 524288/524288 K (Jav ...
- vue中axios的封装(注意这里面异步的概念和用法十分重要)
todo https://www.cnblogs.com/chaoyuehedy/p/9931146.html
- C++入门经典-例3.22-循环嵌套打印三角形
1:代码如下: // 3.22.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...
- linux下快速查找文件(转载)
权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xxmonstor/article/deta ...