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

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

服务器之家 - 编程语言 - Java教程 - SpringBoot实现token登录的示例代码

SpringBoot实现token登录的示例代码

2022-10-23 16:56C'z x Java教程

在进行登录验证时,我们需要session或cookie会话进行验证,当我们脱离浏览器用app等向服务端发请求就没有session和cookie机制,这时我们就需要使用token令牌进行登录验证,本文就详细的介绍一下,感兴趣的可以了解一下

为什么引入token机制?

在进行登录验证时,我们需要session或cookie会话进行验证,客户端包括浏览器、app、微信小程序、公众号,只有浏览器有session和cookie机制,当我们脱离浏览器用app等向服务端发请求就没有session和cookie机制,这时我们就需要使用token令牌进行登录验证。

SpringBoot实现token登录的示例代码

 

代码实现

先建个util包,并创建TokenUtil类用于生成token

SpringBoot实现token登录的示例代码

TokenUtil类代码

package com.qcby.util;

import com.qcby.entity.User;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class TokenUtil {
  /**
   * 创建map用于存储所有的令牌
   *
   * token  -  User
   */
  private static Map<String, User> tokenMap=new HashMap<>();

  /**
   * 生成token,存储token-user对应关系
   * 返回token令牌
   * @param user
   * @return
   */
  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);
  }

  /**
   * 根据token获取用户信息
   * @param token
   * @return
   */
  public static User getUser(String token){
      return tokenMap.get(token);
  }
}

LoginInterceptor类代码

package com.qcby.interceptor;

import com.qcby.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor  implements HandlerInterceptor {

 
  //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的方法
       *  需要配置静态资源不拦截时,添加这块逻辑  => 前后端分离项目
       */
      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....");
  }
}

实现类

@RestController
@RequestMapping("user")
public class UserController { 
  @Autowired
  private UserService userService;
  @ApiOperation("用户登录接口")
  @RequestMapping(value="login",method = {RequestMethod.GET,RequestMethod.POST})
  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 user1=userService.getOne(queryWrapper);
      if(user1!=null){

          String token= TokenUtil.generateToken(user1);
          map.put("cod",1);
          map.put("data",user1);
          map.put("token",token);
      }else {
          map.put("msg","用户名或密码错误!");
      }
      return map;
  }
}

拦截器类可以参考这篇文章,这个token验证就是在拦截器上改动的。

SpringBoot拦截器实现登录拦截

需要有postman验证

SpringBoot实现token登录的示例代码

SpringBoot实现token登录的示例代码

SpringBoot实现token登录的示例代码

到此这篇关于SpringBoot实现token登录的示例代码的文章就介绍到这了,更多相关SpringBoot token登录内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_52012606/article/details/123692236

延伸 · 阅读

精彩推荐