如何使用Java实现登录令牌(Token)验证功能?
一、流程图二、Token1、token是一种客户端认证机制,是一个经过加密的字符串,安全性强,支持跨域2、用户第一次登录,服务器通过数据库校验其UserId和Password合法,则再根据随机数字+userid+当前时间戳再经过DES加密生成一个token串当然具体生成token的方式是开发自己定义的3、token的生成一般是采用uuid保证唯一性,当用户登录时为其生成唯一的token,存储一般保存在数据库中token过期时间采用把token二次保存在cookie或session里面,根据cookie和s
一、流程图

二、Token
1、token是一种客户端认证机制,是一个经过加密的字符串,安全性强,支持跨域
2、用户第一次登录,服务器通过数据库校验其UserId和Password合法,则再根据随机数字+userid+当前时间戳再经过DES加密生成一个token串
当然具体生成token的方式是开发自己定义的
3、token的生成一般是采用uuid保证唯一性,当用户登录时为其生成唯一的token,存储一般保存在数据库中
token过期时间采用把token二次保存在cookie或session里面,根据cookie和session的过期时间去维护token的过期时间
4、Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位
5、Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来
三、分析
建立一个token令牌,在用户登录时候给用户一个独特得令牌值,登录时候嘚赋值这个令牌
在SpringBoot项目中建立一个Util文件夹
文件夹下建立TokenUtil.java文件
public class TokenUtil {
private static Map tokenMap = new HashMap<>();
public static String generateToken(User user){
//生成唯一不重复的字符串
String token = UUID.randomUUID().toString();
tokenMap.put(token,user);
return token;
}
/**
* 验证token是否合法
* @param token
* @return
*/
public static boolean verify(String token){
return tokenMap.containsKey(token);
}
public static User gentUser(String token){
return tokenMap.get(token);
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++){
System.out.println(UUID.randomUUID().toString());
}
}
} 用户登录得UserController.java
@Api( tags = {"用户模块接口"})
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private HttpSession session;
@ApiOperation("登录接口")
@RequestMapping(value = "login",method ={RequestMethod.POST,RequestMethod.GET})
public Map login(User user){
Map map = new HashMap<>();
map.put("code",0);
if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) ){
map.put("msg","用户或者密码为空!");
return map;
}
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username",user.getUsername())
.eq("password",user.getPassword());
User userDb = userService.getOne(queryWrapper);
if(userDb != null){
String token= TokenUtil.generateToken(userDb);
map.put("code",1);
map.put("data",userDb);
map.put("token",token);
session.setAttribute("username",userDb.getUsername());
}else{
map.put("msg","用户名或密码错误!");
}
return map;
}
@ApiImplicitParams(
{
@ApiImplicitParam(name = "id",
value = "用户id", required = true,
dataType = "Long"),
@ApiImplicitParam(name = "name",
value = "测试名字",
dataType = "string")
}
)
@ApiOperation("根据id查询用户信息")
@RequestMapping(value="getById",method ={RequestMethod.POST,RequestMethod.GET})
public User getById(Long id ,String name){
System.out.println(name);
return userService.getById(id);
}
} 在拦截器上操作 interceptor下面LoginInterceptor.java
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private HttpSession httpSession;
//Controller逻辑执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle....");
String uri = request.getRequestURI();
System.out.println("当前路径:"+uri);
/**
* HandlerMethod=>Controller中标注@RequestMapping的方法
* 需要配置静态资源不拦截时,添加这块逻辑 => 前后端分离项目
*
*/
// 是我们的conrtoller中的方法
if (!(handler instanceof HandlerMethod)) {
return true;
}
String token = request.getHeader("qcby-token");
if (!TokenUtil.verify(token)) {
// 未登录跳转到登录界面
throw new RuntimeException("no login!");
} else {
return true;
}
}
//Controller逻辑执行完毕但是视图解析器还未进行解析之前
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle....");
}
//Controller逻辑和视图解析器执行完毕
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion....");
}
}四、运行结果
http://localhost:8080/

http://localhost:8080/user/login?username=admin&password=123456

记住这个令牌
60227b0e-bdbb-47d9-9df4-f56163cb529d
在postman中

写入令牌,输出成功

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















