Java如何实现登录token令牌

作者:叫我老伯 时间:2022-05-19 16:58:11 

一、流程图

Java如何实现登录token令牌

二、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<String, User> 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<String,Object> login(User user){
       Map<String,Object> map = new HashMap<>();
       map.put("code",0);
       if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) ){
           map.put("msg","用户或者密码为空!");
           return map;
       }
       QueryWrapper<User> 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/

Java如何实现登录token令牌

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

Java如何实现登录token令牌

 记住这个令牌    

60227b0e-bdbb-47d9-9df4-f56163cb529d

在postman中

Java如何实现登录token令牌

写入令牌,输出成功

Java如何实现登录token令牌

来源:https://blog.csdn.net/weixin_51309915/article/details/123591670

标签:Java,登录,token,令牌
0
投稿

猜你喜欢

  • Java8中的Stream 流实践操作

    2021-11-01 19:59:33
  • 聊聊Spring AOP @Before @Around @After等advice的执行顺序

    2022-10-27 18:14:20
  • Android Activity之间的数据传递方法总结

    2023-05-26 03:43:21
  • 基于Silverlight DataGrid中无代码设置开始与结束日期DatePicker的实现方法

    2023-05-04 16:34:50
  • 详解SpringMVC使用MultipartFile实现文件的上传

    2023-03-28 00:48:18
  • 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题

    2022-03-16 07:51:24
  • Java实现断点下载服务端与客户端的示例代码

    2022-07-25 14:16:17
  • java寻找迷宫路径的简单实现示例

    2021-07-06 13:17:50
  • Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    2021-07-16 12:37:17
  • SpringBoot使用Druid数据源的配置方法

    2023-08-19 19:52:11
  • Android编程简单实现ImageView点击时背景图修改的方法

    2023-05-23 11:27:40
  • Java编程实现A*算法完整代码

    2022-06-18 12:28:57
  • Android编程下拉菜单spinner用法小结(附2则示例)

    2022-11-02 20:25:45
  • 实现分布式WebSocket集群的方法

    2021-06-12 22:55:10
  • JAVA学习之一步步搭建spring框架

    2023-02-24 06:39:44
  • JDK8中的HashMap初始化和扩容机制详解

    2023-11-25 10:06:44
  • Mybatis generator自动生成代码插件实例解析

    2022-06-04 22:52:33
  • Java实现微信公众号发送模版消息

    2021-07-16 17:03:35
  • ionic App 解决android端在真机上tab处于顶部的问题

    2022-05-11 21:56:57
  • Qt 使用QDialog实现界面遮罩的示例(蒙版)

    2022-10-31 07:58:37
  • asp之家 软件编程 m.aspxhome.com