服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java如何实现登录token令牌

Java如何实现登录token令牌

2022-12-21 19:36叫我老伯 Java教程

这篇文章主要介绍了Java如何实现登录token令牌,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、流程图

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

延伸 · 阅读

精彩推荐