目录
思路
- 令牌生成:登陆成功后,生成JWT令牌,并返回给前端
- 令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验
接口文档
接口文档的链接如下:
https://hkm-web.oss-cn-beijing.aliyuncs.com/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3https://hkm-web.oss-cn-beijing.aliyuncs.com/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3从浏览器发送请求至服务端进行登录请求的功能接口已经实现,接下来需要进行实现的功能接口就是校验访问的用户是否登录成功,即需要完成用户登录成功后为其下发JWT令牌,并在其下一次登陆时进行令牌的校验。
令牌生成和下发
步骤
- 引入JWT令牌操作的工具类
- 登录完成后,调用工具类生成JWT令牌,并返回给前端
具体代码如下
工具类
java
package com.example.tlias.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
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;
}
}
控制类
java
package com.example.tlias.controller;
import com.example.tlias.pojo.Emp;
import com.example.tlias.pojo.Result;
import com.example.tlias.service.EmpService;
import com.example.tlias.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@Slf4j
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result Login(@RequestBody Emp emp) {
log.info("员工登录:{}", emp);
Emp e = empService.Login(emp);
// todo 登录成功,生成并下发令牌
if (e != null) {
Map<String, Object> claims = new HashMap<>();
// 获取员工信息
claims.put("id", e.getId());
claims.put("name", e.getName());
claims.put("username", e.getUsername());
// 生成令牌并添加自定义信息
String jwt = JwtUtils.generateJwt(claims);
// 返回令牌信息至前端
return Result.success(jwt);
}
// todo 登陆失败,返回错误信息
return Result.error("用户名或密码错误");
}
}
测试
-
使用postman进行测试,具体全球路径及请求参数如下
-
登录成功
-
登陆失败
前后端联调
Nginx文件:https://hkm-web.oss-cn-beijing.aliyuncs.com/Nginx
在接口文档中已经说明用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为 token ,值为 登录时下发的 JWT令牌。
运行结果如下:
在登陆界面登录成功过后,访问部门页面