[day13 SpringBoot案例3 登录校验]

1. 登录校验的实现思路是怎样的?

1. 统一拦截:可以使用两种技术实现,Filter过滤器  以及 Interceptor 拦截器。

2. 登录标记:就需要用户登录成功之后,每一次请求中,都可以获取到该标记。

2. 会话技术有哪些方式可以实现?

1. 客户端会话跟踪技术:Cookie

2. 服务端会话跟踪技术:Session

3. JWT令牌组成部分有哪些,各自作用是什么?

第一部分:Header(头),作用:记录令牌类型、签名算法等

{
	"alg":"HS256",
	"type":"JWT"
}

第二部分:Payload(有效载荷),作用:携带一些用户信息及过期时间等

{
	"id":"1",
	"username":"Tom"
}

第三部分:Signature(签名),作用:防止Token被篡改、确保安全性

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret
)

4. 怎么使用JWT令牌?(依赖,创建,校验)

以下三步除了引入依赖,其他都可以在测试启动类里面先测试一下

1. 首先引入JWT的依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2. 生成JWT代码实现

public class JwtDemo {

    @Test
    public void genJwt(){
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("username","Tom");

        String jwt = Jwts.builder()
                .setClaims(claims) //执行第二部分负载, 存储的数据
                .signWith(SignatureAlgorithm.HS256, "itheima") //签名算法及秘钥
                .setExpiration(new Date(System.currentTimeMillis() + 12*3600*1000)) //设置令牌的有效期
                .compact();
        System.out.println(jwt);
    }

}

3. 校验

    @Test
    public void parseJwt(){
        Claims claims = Jwts.parser()
                .setSigningKey("itheima")
            				.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjU5OTk1NTE3LCJ1c2VybmFtZSI6IlRvbSJ9.EUTfeqPkGslekdKBezcWCe7a7xbcIIwB1MXlIccTMwo")
                .getBody();
        System.out.println(claims);
    }

5. 项目中在什么时候去生成令牌?

登陆的时候

6. 当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?

用过滤器或者拦截器

7. 过滤器具体使用的步骤是怎样的?

  • 获取请求url。
  • 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
  • 获取请求头中的令牌(token)。
  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
  • 解析token,如果解析失败,返回错误结果(未登录)。
  • 放行。

8. 拦截器具体使用的步骤是怎样的

拦截路径

urlPattern值

含义

拦截具体路径

/login

只有访问 /login 路径时,才会被拦截

目录拦截

/emps/*

访问/emps下的下一级资源,如: /emps/1 ,但是 不会拦截 /emps/list/1,/emps/list/1/2

目录拦截

/emps/**

访问/emps下的所有资源,都会被拦截

拦截所有

/**

访问所有资源,都会被拦截

9. 项目中异常是怎么处理的?具体怎么实现? 

Mapper层和Service层都可以往上抛

但是到了Controller层就不能继续抛了,就得用try-catch抓取,所以

方法1:就是一个一个的抓,把所有方法都抓一遍。很冗余,很麻烦!

方法2:用全局异常处理器直接全部搞定,一般定义在exception包下:

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * Exception异常分类
     *  - 运行时异常 : RuntimeException , 编译时无需处理 .
     *  - 编译时异常 : 非 RuntimeException , 编译时处理 .
     */
    @ExceptionHandler(Exception.class)
    public Result ex(Exception ex){
        ex.printStackTrace();
        return Result.error("系统繁忙, 请稍后重试 ... ");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值