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

<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>
posted @   黯渊  阅读(297)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示