Spring boot 持久化登录 笔记
参考资料
前期准备
- 创建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、前端页面
<ul class="nav navbar-nav navbar-right">
<!--如果session中的user对象不为空-->
<li class="dropdown" th:if="${session.user != null}">
<a href="#" th:text="${session.user.getName()}"> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">消息中心</a></li>
<li><a href="#">个人资料</a></li>
<li><a href="#">退出登录</a></li>
</ul>
</li>
<!--如果session中的user对象为空-->
<li th:if="${session.user == null}">
<a href="#">登录</a>
</li>
</ul>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现