Spring boot 持久化登录 笔记


参考资料

B站博主 逆风微笑的代码狗 的视频

前期准备

  • 创建Springbooti项目
  • 连接好数据库

步骤

1、编写实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {


    private Integer id;
    private String accountId;
    private String name;
    private String token;
    private Long gmtCreate;
    private Long gmtModified;
}

2、编写Mapper

@Mapper
public interface UserMapper {
	//插入用户
    @Insert("insert into user(account_id,name,token,gmt_create,gmt_modified) values(#{accountId},#{name},#{token},#{gmtCreate},#{gmtModified})")
    void insert(User user);

    //根据token查找用户
    @Select("select * from user where token = #{token}")
    User findToken(@Param("token") String token);
}

3、编写LoginController

当用户首次登录成功时,用户的信息就会被保存到数据库中,并且在浏览器中创建了一个Cookie对象

@Controller
public class AuthorizeController {

    @Autowired
    AccessTokenDto accessTokenDto;

    @Autowired
    GiteeProvider giteeProvider;

    @Value("${gitee.client_id}")
    private String client_id;

    @Value("${gitee.redirect_uri}")
    private String redirect_uri;

    @Value("${gitee.client_secret}")
    private String client_secret;

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/callback")
    public String callback(@RequestParam(name = "code")String code,
                           @RequestParam(name = "state")String state,
                           HttpServletRequest request,
                           HttpServletResponse response){

        accessTokenDto.setClient_id(client_id);
        accessTokenDto.setRedirect_uri(redirect_uri);
        accessTokenDto.setClient_secret(client_secret);
        accessTokenDto.setCode(code);
        accessTokenDto.setState(state);

        String accessToken = giteeProvider.getAccessToken(accessTokenDto);

        GiteeUser giteeUser = giteeProvider.getUser(accessToken);

        //以上是通过第三方登录得到用户信息,重点在下面
        if(giteeUser != null){//登录成功
		//1、创建用户对象
            User user = new User();
            //通过UUID创建token值
            String token = UUID.randomUUID().toString();
            //将创建的token值和从第三方平台得到的数据保存到实体类中
            user.setToken(token);
            user.setName(giteeUser.getName());
            user.setAccountId(String.valueOf(giteeUser.getId()));
            user.setGmtCreate(System.currentTimeMillis());
            user.setGmtModified(user.getGmtCreate());
         //2、将实体类保存到数据库
            userMapper.insert(user);
		//3、向浏览器中添加Cookie对象
            response.addCookie(new Cookie("token", token));
		//4、将用户实体类保存到session域中
            request.getSession().setAttribute("user", giteeUser);
        //5、返回首页
            return "redirect:/";
        }else{
            //登陆失败,重新登陆
            return "redirect:/";
        }
    }
}

4、编写 首页Controller

当用户再次访问首页时,可以从Cookie中得到我们存放得Cookie对象,并根据Cookie对象中得数据访问数据库,以此来得到用户信息

@Controller
public class IndexController {
    /*
    * 首页访问路径设置
    * */
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/")
    public String hello(HttpServletRequest request){
        //1、得到Cookie对象数组
        Cookie[] cookies = request.getCookies();
        //2、遍历找到我们要得Cookie对象
        for(Cookie cookie : cookies){
            if( "token".equals(cookie.getName())){
                String  token = cookie.getValue();
                //通过Cookie对象中得数据访问数据库
                User user = userMapper.findToken(token);
                if(user != null){
                     request.getSession().setAttribute("user", user);
                }
                break;
            }
        }
        return "index";
    }
}

5、前端页面