前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从0到1开发测试平台(十)后端增加登录token返回

从0到1开发测试平台(十)后端增加登录token返回

作者头像
周辰晨
发布2020-08-20 14:56:15
5830
发布2020-08-20 14:56:15
举报

什么是token

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

为什么要使用token

我们可以登录的时候生成token,然后接口带上token,我们就可以去数据库或者缓存里查询token是否有效,有效则认为验证成功。

生成token的几种方式:

(1)最简单省事的方法,使用uuid生成token

(2)使用jwt令牌

(3)用session值作为Token

(4)用设备号/设备mac地址作为Token

一般对外的系统采用Jwt令牌的比较多,为了快速搭建我们的平台,这里我们使用第一种。

项目中引入token

1.数据库新增user_login表

代码语言:javascript
复制
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_login
-- ----------------------------
DROP TABLE IF EXISTS `user_login`;
CREATE TABLE `user_login`  (
  `ID` bigint(16) NOT NULL AUTO_INCREMENT,
  `USER_ID` bigint(16) NULL DEFAULT 0,
  `TOKEN` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `EXPIRATION_DATE` timestamp(0) NULL DEFAULT NULL,
  `CREATE_DATE` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `LAST_UPDATE_DATE` timestamp(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
  `IS_VALID` tinyint(2) NOT NULL DEFAULT 1,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 158 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2.引入jpa第三方依赖

代码语言:javascript
复制
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

3.增加BaseDomain和UserLogin实体类

代码语言:javascript
复制
package com.caomingyu.cctestplatform.bean;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;

import javax.persistence.MappedSuperclass;

@Data
@ToString
@MappedSuperclass
public class BaseDomain {
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private java.util.Date createDate;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
    private java.util.Date lastUpdateDate;
    private Integer isValid;
}
代码语言:javascript
复制
package com.caomingyu.cctestplatform.bean;

import lombok.Data;
import lombok.ToString;

import javax.persistence.*;
import java.sql.Timestamp;

@Data
@ToString
@Entity
@Table(name = "t_user_login")
public class UserLogin extends BaseDomain {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long userId;
    private String token;
    private Timestamp expirationDate;
}

4.增加UserRepository便可以使用jpa直接对应数据库的基本增删改查

代码语言:javascript
复制
package com.caomingyu.cctestplatform.repository;

import com.caomingyu.cctestplatform.bean.UserLogin;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserLoginRepository extends JpaRepository<UserLogin,Long> {
}

5.在UserServiceImpl.java中的login方法里加入生产token的代码

代码语言:javascript
复制
@Override
    public Result login(String userName, String password) {
        User user = queryUserByName(userName);
        if (user == null){
            return Result.resultError(ResultType.USER_NOT_EXIST, StatusCode.USER_NOT_EXIST);
        }
        String passwordParam = Md5Utils.string2MD5(password);
        if (!passwordParam.equals(user.getPassword())){
            return Result.resultError(ResultType.USER_NAME_OR_PASSWORD_EORROR, StatusCode.USER_NAME_OR_PASSWORD_EORROR);
        }
        String uuid = UUID.randomUUID().toString();
        UserLogin userLogin = new UserLogin();
        userLogin.setToken(uuid);
        userLogin.setIsValid(1);
        Calendar cal = Calendar.getInstance();
        cal.add(cal.DATE, 30);
        userLogin.setExpirationDate(new Timestamp(cal.getTime().getTime()));
        userLogin.setUserId(user.getId());
        userLogin.setCreateDate(new Date());
        userLogin = userLoginRepository.save(userLogin);
        user.setToken(userLogin.getToken());
        return Result.resultSuccess(null,user,ResultType.LOGIN_SUCCESS);
    }

6.然后我们通过postman访问登录接口,看到成功返回如下

我们打开数据库user_login表,看到成功插入了一条登录信息

补充:JPA是什么?

JPA(Java Persistence API)是Sun官方提出的Java持久化规范. 为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据. 它的出现是为了简化现有的持久化开发工作和整合ORM技术. 结束各个ORM框架各自为营的局面。

JPA仅仅是一套规范,不是一套产品, 也就是说Hibernate, TopLink等是实现了JPA规范的一套产品。

Spring Data JPA是Spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架,是基于Hibernate之上构建的JPA使用解决方案,用极简的代码实现了对数据库的访问和操作,包括了增、删、改、查等在内的常用功能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师影响力 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档