现在前后端分离技术是一个比较流行的开发模式,前端与后端分别运行在不同的环境中,后端没有与前端直接关联
前端向用户展示页面,后端向前端提供数据接口,前后端通过唯一标识token进行数据交互
什么是token
token是前后端交互的凭证, 拿着这个凭证前端可以频繁访问后端且不用做权限验证
token生成步骤
1. 前端用户登录后,后端会返回一个唯一标识token,
2. 前端将token存起来,每次访问后台时都会带着这个token,
3. 后端会获取请求里的token, 验证token是否合法
4. 后端向前端返回数据
这么说起来很简单,但实际开发中也不是那么容易的
首先我们会在用户登录成功后进行用户的会话设置
/**
* 设置会话信息
*/
public Map setSessions(HttpServletResponse resp){
// 模拟登陆的用户数据
UserInfo userinfo = new UserInfo();
userinfo.setId("A001");
userinfo.setUserName("qi");
userinfo.setPhone("132****1972");
userinfo.setDept("开发部");
//设置tokenKey
String tokenKey = "uuid";
// 将token存入缓存中
// token在项目中使用得场景很多, 有的有效期较短,比如验证码、短信验证,也有有效期长的,比如登录后
// 这里在token后加个visit就是声明我是一个访问的token,与其他token进行区分
redisUtil.set("token:visit:"+ userinfo.getUserid(),tokenKey,24*60*24);
// 将用户的信息存入redis中, 存用户数据(这里没用到,但实际开发会通过缓存获取对象数据)
redisUtil.set("token:data:visit:" + tokenKey, userinfo ,24*60*24);
//设置cookie 这是一段伪代码,具体实现根据项目实际情况进行设置
cookie = new Cookie("access_token", tokenKey);
// 将cookie存入resp相应中
resp.addCookie(cookie)
// 将token翻入消息头
resp.addHeader("access_token",tokenKey);
// 将用户信息放入map中,返给前端
HashMap hashMap = new HashMap();
hashMap.put("userid",userinfo.getUserid());
hashMap.put("userName",userinfo.getUserName());
hashMap.put("access_token",tokenKey);
return hashMap;
}
后端将token返回前端, 前端获取token并存储,每次访问后端是都要带上token
附: 后端验证 token的代码
/**
* 判断token是否有效
* @return
*/
private boolean isValidToken(HttpServletRequest req){
// 获取 Header中的token
String access_token=req.getHeader("access_token");
// 获取用户主键
String userId = req.getParameter("userId");
if(StringUtil.trim(tokenKey).equals("")){
return false;
}
// 拼接token的键
String token = "token:visit:"+userId;
// 判断这个对象是否存在
boolean flag = redisUtil.hasKey(token);
return flag;
}
写的不太好,还请大家多多指教