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、前端页面