Java如何实现登录token令牌

 更新时间:2022年05月21日 14:36:00   作者:叫我老伯  
这篇文章主要介绍了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/

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

 记住这个令牌    

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

在postman中

写入令牌,输出成功

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot结合mybatis-plus快速生成项目模板的方法

    springboot结合mybatis-plus快速生成项目模板的方法

    Mybatis-Plus是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生,接下来通过本文给大家分享springboot结合mybatis-plus快速生成项目模板的方法,感兴趣的朋友一起看看吧
    2021-06-06
  • 你都理解创建线程池的参数吗?

    你都理解创建线程池的参数吗?

    这篇文章主要介绍了创建线程池参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解关于springboot-actuator监控的401无权限访问

    详解关于springboot-actuator监控的401无权限访问

    本篇文章主要介绍了详解关于springboot-actuator监控的401无权限访问,非常具有实用价值,有兴趣的可以了解一下
    2017-09-09
  • Java对List进行排序的两种实现方法

    Java对List进行排序的两种实现方法

    这篇文章主要给大家介绍了关于Java对List进行排序的两种实现方法,第一种是实体类自己实现比较,第二种是借助比较器进行排序,下面开一起看看详细的介绍吧,有需要的朋友们可以参考借鉴。
    2016-12-12
  • Java算法实战之排一亿个随机数

    Java算法实战之排一亿个随机数

    我们在生活中经常遇见一些这样的需求,随机点名、公司年会抽奖、微信拼手气红包等,还有一些游戏比如打地鼠小游戏、俄罗斯方块等,这些场景中都会用到一种算法:随机,这篇文章主要给大家介绍了关于Java算法实战之排一亿个随机数的相关资料,需要的朋友可以参考下
    2021-11-11
  • Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    这篇文章主要介绍了Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 基于IDEA建立module操作步骤解析

    基于IDEA建立module操作步骤解析

    这篇文章主要介绍了基于IDEA建立module操作步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 简单实现Java通讯录系统

    简单实现Java通讯录系统

    这篇文章主要为大家详细介绍了如何简单实现Java通讯录系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Redisson 分布式延时队列 RedissonDelayedQueue 运行流程

    Redisson 分布式延时队列 RedissonDelayedQueue 运行流程

    这篇文章主要介绍了Redisson分布式延时队列 RedissonDelayedQueue运行流程,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Spring @Configuration和@Component的区别

    Spring @Configuration和@Component的区别

    今天小编就为大家分享一篇关于Spring @Configuration和@Component的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论