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("系统繁忙, 请稍后重试 ... ");
}
}