-
登录校验的实现思路是怎样的?
接收前端请求传递的用户名和密码,再根据用户名和密码查询用户信息,后台逻辑判断用户名或密码是否正确,正确则返回成功结果,跳转至首页;错误则弹窗提醒。
先建LoginController,调用Service层完成逻辑
-
会话技术有哪些方式可以实现?
会话:用户打开浏览器,访问web服务器资源,即会话建立。(一次会话可以有多次请求和响应)
客户端会话跟踪技术:Cookie(存储在浏览器端)
服务端会话跟踪技术:Session(存储在服务器端)
JWT令牌:定义一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。
-
JWT令牌组成部分有哪些,各自作用是什么?
Header(头):记录令牌类型、签名算法等。
Payload(有效载荷):携带一些用户信息及过期时间等。
Signature:防止Token被篡改、确保安全性。
-
怎么使用JWT令牌?(依赖,创建,校验)
1). pom.xml 引入jwt的依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>2). 引入工具类
public class JwtUtils {
private static String signKey = "itheima";
private static Long expire = 43200000L;
/**
* 生成JWT令牌
* @param claims JWT第二部分负载 payload 中存储的内容
* @return
*/
public static String generateJwt(Map<String, Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)//执行第二部分负载,存储的数据
.signWith(SignatureAlgorithm.HS256, signKey)//签名算法//设置令牌的有效期
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分负载 payload 中存储的内容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}3). 登录成功,生成JWT令牌并返回
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp){
Emp e = empService.login(emp);
if(e != null){ //用户名密码正确
Map<String,Object> claims = new HashMap<>();
claims.put("id",e.getId());
claims.put("username",e.getUsername());
claims.put("name",e.getName());//生成JWT令牌
String jwt = JwtUtils.generateJwt(claims);
return Result.success(jwt);
}
return Result.error("用户名或密码错误");
}
}
- JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
- 如果JWT令牌解析校验时报错,则说明 JWT令牌被篡改 或 失效了,令牌非法
5. 项目中在什么时候去生成令牌?
用户登录时生成令牌:当用户成功登录后,你可以生成一个JWT令牌并将其返回给客户端。这个令牌可以包含用户的身份信息和其他必要的数据。客户端在后续的请求中可以将该令牌作为身份验证凭证发送给服务端。
6. 当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?
通过签名密钥,必须和生成JWT令牌时使用的秘钥是配套的
检验令牌是否合法,是否时效或被篡改,以此来判断
7. 过滤器具体使用的步骤是怎样的?
定义类,实现Filter接口,并重写其所有方法
在类上定义@WebFilter注解,配置Filter拦截资源的路径
在doFile方法中输出一句话,并放行
在引导类上只用@ServletComponentScan开启Servlet组件支持
8. 拦截器具体使用的步骤是怎样的?
请求—> doFilter—> DispatcherServlet—> reHandle —>Controller中的方法执行—> postHandle—> afterComplecation—> doFilter
9. 项目中异常是怎么处理的?具体怎么实现?
未做处理,也就意味着,Mapper层出现的异常,会自动往上抛,抛给service层。 service层出现的异常,也会自动往上抛,抛给controller。 而controller中也并未处理,此时再往上抛,就抛给框架了,框架会就会将错误信息响应给用户。
- 方案一:在Controller的方法中进行try…catch处理 (代码过于臃肿)
- 方案二:全局异常处理器