Sa-Token登录认证

package com.hqyj.wang.restController;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
//    测试登录
    @GetMapping("/doLogin")
    public Object doLogin(String username,String password){
//        第一步:对比前端提交的账号名称和密码是否正确,比对成功后开始登录
        if("zhang".equals(username) && "123456".equals(password)){
//            第二步:根据账号id,进行登录。填入的参数应该保持用户表唯一,比如用户id,不能填入整个对象
            StpUtil.login(10001);
//            第三步:返回数据给前端。SaReasult是对返回结果的简单封装。
            return SaResult.ok("登录成功") ;
        }
        return SaResult.error("登录失败") ;
    }
//    查询登录状态
    @GetMapping("/isLogin")
    public Object isLogin(){
//        StpUtil.isLogin()查询当前客户端是否登录,返回true或false
        return SaResult.ok("当前会话是否登录:"+StpUtil.isLogin()) ;
    }
    // 校验当前登录状态
    @RequestMapping("checkLogin")
    public SaResult checkLogin() {
        // 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
        StpUtil.checkLogin();

        // 抛出异常后,代码将走入全局异常处理(GlobalException.java),如果没有抛出异常,则代表通过了登录校验,返回下面信息
        return SaResult.ok("校验登录成功,这行字符串是只有登录后才会返回的信息");
    }
    // 获取当前登录的账号是谁
    @RequestMapping("getLoginId")
    public SaResult getLoginId() {
        // 需要注意的是,StpUtil.getLoginId() 自带登录校验效果
        // 也就是说如果在未登录的情况下调用这句代码,框架就会抛出 `NotLoginException` 异常,效果和 StpUtil.checkLogin() 是一样的
        Object userId = StpUtil.getLoginId();
        System.out.println("当前登录的账号id是:" + userId);

        // 如果不希望 StpUtil.getLoginId() 触发登录校验效果,可以填入一个默认值
        // 如果会话未登录,则返回这个默认值,如果会话已登录,将正常返回登录的账号id
        Object userId2 = StpUtil.getLoginId(0);
        System.out.println("当前登录的账号id是:" + userId2);

        // 或者使其在未登录的时候返回 null
        Object userId3 = StpUtil.getLoginIdDefaultNull();
        System.out.println("当前登录的账号id是:" + userId3);

        // 类型转换:
        // StpUtil.getLoginId() 返回的是 Object 类型,你可以使用以下方法指定其返回的类型
        int userId4 = StpUtil.getLoginIdAsInt();  // 将返回值转换为 int 类型
        long userId5 = StpUtil.getLoginIdAsLong();  // 将返回值转换为 long 类型
        String userId6 = StpUtil.getLoginIdAsString();  // 将返回值转换为 String 类型

        // 疑问:数据基本类型不是有八个吗,为什么只封装以上三种类型的转换?
        // 因为大多数项目都是拿 int、long 或 String 声明 UserId 的类型的,实在没见过哪个项目用 double、float、boolean 之类来声明 UserId
        System.out.println("当前登录的账号id是:" + userId4 + " --- " + userId5 + " --- " + userId6);

        // 返回给前端
        return SaResult.ok("当前客户端登录的账号id是:" + userId);
    }
    // 查询 Token 信息
    @RequestMapping("tokenInfo")
    public SaResult tokenInfo() {
        // TokenName 是 Token 名称的意思,此值也决定了前端提交 Token 时应该使用的参数名称
        String tokenName = StpUtil.getTokenName();
        System.out.println("前端提交 Token 时应该使用的参数名称:" + tokenName);

        // 使用 StpUtil.getTokenValue() 获取前端提交的 Token 值
        // 框架默认前端可以从以下三个途径中提交 Token:
        // 		Cookie 		(浏览器自动提交)
        // 		Header头	(代码手动提交)
        // 		Query 参数	(代码手动提交) 例如: /user/getInfo?satoken=xxxx-xxxx-xxxx-xxxx
        // 读取顺序为: Query 参数 --> Header头 -- > Cookie
        // 以上三个地方都读取不到 Token 信息的话,则视为前端没有提交 Token
        String tokenValue = StpUtil.getTokenValue();
        System.out.println("前端提交的Token值为:" + tokenValue);

        // TokenInfo 包含了此 Token 的大多数信息
        SaTokenInfo info = StpUtil.getTokenInfo();
        System.out.println("Token 名称:" + info.getTokenName());
        System.out.println("Token 值:" + info.getTokenValue());
        System.out.println("当前是否登录:" + info.getIsLogin());
        System.out.println("当前登录的账号id:" + info.getLoginId());
        System.out.println("当前登录账号的类型:" + info.getLoginType());
        System.out.println("当前登录客户端的设备类型:" + info.getLoginDevice());
        System.out.println("当前 Token 的剩余有效期:" + info.getTokenTimeout()); // 单位:秒,-1代表永久有效,-2代表值不存在
        System.out.println("当前 Token 距离被冻结还剩:" + info.getTokenActiveTimeout()); // 单位:秒,-1代表永久有效,-2代表值不存在
        System.out.println("当前 Account-Session 的剩余有效期" + info.getSessionTimeout()); // 单位:秒,-1代表永久有效,-2代表值不存在
        System.out.println("当前 Token-Session 的剩余有效期" + info.getTokenSessionTimeout()); // 单位:秒,-1代表永久有效,-2代表值不存在

        // 返回给前端
        return SaResult.data(StpUtil.getTokenInfo());
    }

    //   测试注销
    @GetMapping("/logout")
    public Object logout(){
        // 退出登录会清除三个地方的数据:
        // 		1、Redis中保存的 Token 信息
        // 		2、当前请求上下文中保存的 Token 信息
        // 		3、Cookie 中保存的 Token 信息(如果未使用Cookie模式则不会清除)
        StpUtil.logout();

        // StpUtil.logout() 在未登录时也是可以调用成功的,
        // 也就是说,无论客户端有没有登录,执行完 StpUtil.logout() 后,都会处于未登录状态
        System.out.println("当前是否处于登录状态:" + StpUtil.isLogin());

        // 返回给前端
        return SaResult.ok("退出登录成功");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值