ASCII码 ASCII码

Java如何实现登录token令牌

发布于:2022-05-22 12:02:24  栏目:技术文档

目录一、流程图二、Token三、分析四、运行结果

一、流程图二、Token1、token是一种客户端认证机制,是一个经过加密的字符串,安全性强,支持跨域

2、用户第一次登录,服务器通过数据库校验其UserId和Password合法,则再根据随机数字+userid+当前时间戳再经过DES加密生成一个token串

⑴当然具体生成token的方式是开发自己定义的

3、token的生成一般是采用uuid保证唯一性,当用户登录时为其生成唯一的token,存储一般保存在数据库中

⑴token过期时间采用把token二次保存在cookie或session里面,根据cookie和session的过期时间去维护token的过期时间

4、Token是在服务端产生的。如果前端使用用户名/密ma向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位

5、Token,就是令牌,最大的特点就是随机性,不可预ce。一般黑客或软件无法猜测出来

三、分析建立一个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; }

  1. /**
  2. * 验证token是否合法
  3. * @param token
  4. * @return
  5. */
  6. public static boolean verify(String token){
  7. return tokenMap.containsKey(token);
  8. }
  9. public static User gentUser(String token){
  10. return tokenMap.get(token);
  11. }
  12. public static void main(String[] args) {
  13. for (int i = 0; i < 20; i++){
  14. System.out.println(UUID.randomUUID().toString());
  15. }
  16. }

}用户登录得UserController.java@Api( tags = {“用户模块接口”})@RestController@RequestMapping(“user”)public class UserController { @Autowired private UserService userService;

  1. @Autowired
  2. private HttpSession session;
  3. @ApiOperation("登录接口")
  4. @RequestMapping(value = "login",method ={RequestMethod.POST,RequestMethod.GET})
  5. public Map<String,Object> login(User user){
  6. Map<String,Object> map = new HashMap<>();
  7. map.put("code",0);
  8. if(StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword()) ){
  9. map.put("msg","用户或者密ma为空!");
  10. return map;
  11. }
  12. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  13. queryWrapper.eq("username",user.getUsername())
  14. .eq("password",user.getPassword());
  15. User userDb = userService.getOne(queryWrapper);
  16. if(userDb != null){
  17. String token= TokenUtil.generateToken(userDb);
  18. map.put("code",1);
  19. map.put("data",userDb);
  20. map.put("token",token);
  21. session.setAttribute("username",userDb.getUsername());
  22. }else{
  23. map.put("msg","用户名或密ma错误!");
  24. }
  25. return map;
  26. }
  27. @ApiImplicitParams(
  28. {
  29. @ApiImplicitParam(name = "id",
  30. value = "用户id", required = true,
  31. dataType = "Long"),
  32. @ApiImplicitParam(name = "name",
  33. value = "测试名字",
  34. dataType = "string")
  35. }
  36. )
  37. @ApiOperation("根据id查询用户信息")
  38. @RequestMapping(value="getById",method ={RequestMethod.POST,RequestMethod.GET})
  39. public User getById(Long id ,String name){
  40. System.out.println(name);
  41. return userService.getById(id);
  42. }

}在拦截器上操作 interceptor下面LoginInterceptor.javapublic class LoginInterceptor implements HandlerInterceptor {

  1. @Autowired
  2. private HttpSession httpSession;
  3. //Controller逻辑执行之前
  4. @Override
  5. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  6. System.out.println("preHandle....");
  7. String uri = request.getRequestURI();
  8. System.out.println("当前路径:"+uri);
  9. /**
  10. * HandlerMethod=>Controller中标注@RequestMapping的方法
  11. * 需要配置静态资源不拦截时,添加这块逻辑 => 前后端分离项目
  12. *
  13. */
  14. // 是我们的conrtoller中的方法
  15. if (!(handler instanceof HandlerMethod)) {
  16. return true;
  17. }
  18. String token = request.getHeader("qcby-token");
  19. if (!TokenUtil.verify(token)) {
  20. // 未登录跳转到登录界面
  21. throw new RuntimeException("no login!");
  22. } else {
  23. return true;
  24. }
  25. }
  26. //Controller逻辑执行完毕但是视图解析器还未进行解析之前
  27. @Override
  28. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  29. System.out.println("postHandle....");
  30. }
  31. //Controller逻辑和视图解析器执行完毕
  32. @Override
  33. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  34. System.out.println("afterCompletion....");
  35. }

}`四、运行结果http://localhost:8080/http://localhost:8080/user/login?username=admin&password=123456记住这个令牌

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

在postman中写入令牌,输出成功

相关推荐
阅读 +