目录
思路
接口文档
令牌生成和下发
步骤
具体代码如下
工具类
控制类
测试
前后端联调
思路
- 令牌生成:登陆成功后,生成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令牌,并返回给前端
具体代码如下
工具类
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;}
}
控制类
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 {@Autowiredprivate 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令牌。
运行结果如下:
在登陆界面登录成功过后,访问部门页面