首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

什么是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使用解决方案,用极简的代码实现了对数据库的访问和操作,包括了增、删、改、查等在内的常用功能。

下一篇
举报
领券