1.登录校验的实现思路是怎样的?
实现思路:在访问资源前进行访问的拦截,判断你当前会话是否有登录,如果没有登录拒绝访问。如果是登录的那就可以进行访问资源。
2.会话技术有哪些方式可以实现?
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
传统技术:使用Cookie(浏览器端)+Session(服务器端)实现会话,进行会话跟踪。
弊端:不能在集群服务中灵话使用,手机客户端无法支持Cookie。令牌技术:
优点:可以在集群服务中灵活使用,移动端也可以支持。
3.JWT令牌组成部分有哪些,各自作用是什么?
- Header(头),作用:记录令牌类型、加密算法等;
- Payload(有效载荷),作用:存储一些令牌携带的用户信息,比如id,username,过期时间等
- Signature(签名),作用:防止Token(令牌)被篡改、确保安全性。
4. 怎么使用JWT令牌?(依赖,创建,校验)
1). pom.xml 引入jwt的依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2). 生成令牌
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);
}
注意事项:
- JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
- 如果JWT令牌解析校验时报错,则说明 JWT令牌被篡改 或 失效了,令牌非法。
5.项目中在什么时候去生成令牌?
在登录时生成令牌,在访问核心资源的时候进行令牌的校验
7.当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?
需要在服务端统一拦截校验JWT令牌
两种手段实现:过滤器Filter、拦截器Interceptor。
8.过滤器具体使用的步骤是怎样的?
1). 定义类,实现 Filter接口,并重写doFilter
方法
2). 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解
3). 在doFilter方法中输出一句话,并放行
4). 在启动类上使用@ServletComponentScan
开启 Servlet 组件扫描
代码如下:
9.拦截器具体使用的步骤是怎样的?
- 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
- 注册拦截器
10.项目中异常是怎么处理的?具体怎么实现?
方案一:在Controller的方法中进行try…catch处理 (代码过于臃肿)
方案二:全局异常处理器全局异常处理的实现步骤:
1、创建一个类用来专门处理异常,在类上面加上注解:@RestControllerAdvice
2、在里面写一个方法用来处理异常:该方法返回值类型用同一响应结果Result,还需要使用注解@ExceptionHandler去定义要处理的异常类型。