广西建设网站培训,做lol数据的网站有哪些,网站程序模板,如何网上外贸接单JWT 由三部分组成#xff0c;用点#xff08;.#xff09;分隔 Header#xff08;头部#xff09; Payload#xff08;负载#xff09;Signature#xff08;签名) 一、原理
Jwt原理其实很简单#xff0c;在后端首先要有个拦截器#xff0c;他会拦截所有http请求用点.分隔 Header头部 Payload负载Signature签名) 一、原理
Jwt原理其实很简单在后端首先要有个拦截器他会拦截所有http请求意思就是所有访问都被拦截掉当然这是不合理的。所以首先我们要手动放行登陆页面也就是登录请求不拦截可以访问然后自此以后的所有请求都会被拦截。如何不让他拦截呢这时候就要设置一些规则来放行请求那么这个规则就是Jwt令牌的用处。他会生成一个token在前后端传来传去怎么传呢前端的http请求都有一个headertoken就会被携带在里面后端解析http请求拿到token来验证。如果通过则放行不通过就拦截。注意token在实体类中有字段但是数据库中不必有专门的列来保存token TableField(exist false)private String token;
二、第一次请求生成token不验证token
1.首先当用户成功登陆时会请求/login PostMapping(/login)public Result login(RequestBody User user) {if(StrUtil.isBlank(user.getUsername()) || StrUtil.isBlank(user.getPassword())) {return Result.error(帐号或密码不能为空);}user userService.loginUser(user);return Result.success(user);}
2.访问user的服务层的loginUSer先通过user参数查询对应的user给dbuser判断是否存在和user参数的密码和查到的密码是否相同。都满足则创建token把token通过set方法给dbuser返回给前端 Overridepublic User loginUser(User user) {User dbuser userMapper.selectByUsername(user.getUsername());if(dbuser null){throw new ServiceException(用户名或密码错误);}if(!user.getPassword().equals(dbuser.getPassword())){throw new ServiceException(用户名或密码错误);}String token TokenUtils.createToken(dbuser.getId().toString(), dbuser.getPassword());dbuser.setToken(token);return dbuser;}
这里面用到了TokenUtils的createToken方法就是生成token的地方
Component // 标记此类为Spring组件使其可以被Spring管理
public class TokenUtils {// 声明一个静态的UserMapper用于在静态方法中访问用户数据private static UserMapper staticUserMapper;// 注入UserMapper实例ResourceUserMapper userMapper;// 在类实例化后设置静态的UserMapperPostConstruct // 标记此方法在构造函数后自动执行public void setUserService() {staticUserMapper userMapper; // 将实例UserMapper赋值给静态变量}/*** 生成token** param userId 用户ID* param sign 用于签名的密钥* return 生成的token字符串*/public static String createToken(String userId, String sign) {// 创建JWT并设置载荷return JWT.create().withAudience(userId) // 将用户ID存储在token的载荷中.withExpiresAt(DateUtil.offsetHour(new Date(), 2)) // 设置token有效期为2小时.sign(Algorithm.HMAC256(sign)); // 使用指定的密钥签名token}}三、随后的请求都要验证token
上面我们已经说到第一次请求也就是登录时会生成token返回给前端。前端会保存在浏览器中以后每次header里面都会携带这个token那么现在就开始第二次请求。
1.验证token过程
因为拦截器的作用发过来的http请求会被拦截以验证规则。
当前端请求发送到后端会首先进到这里验证token而不是直接访问GetMapping(*请求的接口*)
首先会从请求头拿token如果没有则拦截否则 验证token是否为空如果为空拦截
不为空后解析token中user的id然后查询数据库是否有这个user否则拦截当查到后
使用用户密码生成一个验证器为什么是密码呢因为上面我们生成token时就是用密码作为密钥与传过来的token进行验证如果通过则验证成功不拦截请求访问GetMapping(*请求的接口*)
/*** 功能JWT 拦截器用于对请求进行身份验证* 作者lhp* 日期2024/9/26 23:01*/
public class JwtInterceptor implements HandlerInterceptor {Resourceprivate UserMapper userMapper; // 自动注入 UserMapper用于数据库操作Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 从请求头中获取 tokenString token request.getHeader(token);// 如果请求头中没有 token则尝试从请求参数中获取if (StrUtil.isBlank(token)) {token request.getParameter(token);}// 执行认证首先检查 token 是否为空if (StrUtil.isBlank(token)) {// 如果 token 为空抛出未授权异常throw new ServiceException(401, 请登录);}// 获取 token 中的用户 IDString userId;try {userId JWT.decode(token).getAudience().get(0); // 解码 token获取用户 ID} catch (JWTDecodeException j) {// 解码失败抛出未授权异常throw new ServiceException(401, 请登录);}// 根据 token 中的 userId 查询数据库获取用户信息User user userMapper.selectById(Integer.valueOf(userId));if (user null) {// 如果用户不存在抛出未授权异常throw new ServiceException(401, 请登录);}// 使用用户密码生成 JWTVerifier用于验证 tokenJWTVerifier jwtVerifier JWT.require(Algorithm.HMAC256(user.getPassword())).build();try {// 验证 token 的有效性jwtVerifier.verify(token);} catch (JWTVerificationException e) {// 验证失败抛出未授权异常throw new ServiceException(401, 请登录);}// 所有验证通过返回 true表示请求可以继续return true;}
}至此就是Jwt的整个流程。以下是拦截器的代码这个配置类的主要功能是设置一个 JWT 拦截器用于拦截所有的 HTTP 请求以便于进行身份验证但对 /login 请求路径不进行拦截
/*** 功能拦截器配置类用于配置和注册自定义的拦截器* 作者lhp* 日期2024/9/26 23:15*/
Configuration // 标记该类为配置类Spring 会在运行时自动识别并加载该类的 Bean 定义
public class InterceptorConfig extends WebMvcConfigurationSupport {/*** 重写 addInterceptors 方法用于添加自定义拦截器* * param registry 拦截器注册中心用于注册自定义拦截器*/Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 注册 JwtInterceptor 拦截器registry.addInterceptor(jwtInterceptor()).addPathPatterns(/**) // 拦截所有请求路径.excludePathPatterns(/login); // 排除登录路径不拦截登录请求// 调用父类的 addInterceptors 方法确保其他配置能够正常工作super.addInterceptors(registry);}/*** 定义 JwtInterceptor BeanSpring 会自动管理该 Bean 的生命周期* * return JwtInterceptor 实例*/Beanpublic JwtInterceptor jwtInterceptor() {return new JwtInterceptor(); // 创建并返回 JwtInterceptor 的新实例}
} 文章转载自: http://www.morning.lzqdd.cn.gov.cn.lzqdd.cn http://www.morning.ydmml.cn.gov.cn.ydmml.cn http://www.morning.ymtbr.cn.gov.cn.ymtbr.cn http://www.morning.nlbhj.cn.gov.cn.nlbhj.cn http://www.morning.rpms.cn.gov.cn.rpms.cn http://www.morning.syxmx.cn.gov.cn.syxmx.cn http://www.morning.tyrlk.cn.gov.cn.tyrlk.cn http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn http://www.morning.krxzl.cn.gov.cn.krxzl.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.tdscl.cn.gov.cn.tdscl.cn http://www.morning.cnqwn.cn.gov.cn.cnqwn.cn http://www.morning.qznkn.cn.gov.cn.qznkn.cn http://www.morning.wlstn.cn.gov.cn.wlstn.cn http://www.morning.prkdl.cn.gov.cn.prkdl.cn http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn http://www.morning.tznlz.cn.gov.cn.tznlz.cn http://www.morning.gwsdt.cn.gov.cn.gwsdt.cn http://www.morning.fnmgr.cn.gov.cn.fnmgr.cn http://www.morning.qxljc.cn.gov.cn.qxljc.cn http://www.morning.zxxys.cn.gov.cn.zxxys.cn http://www.morning.swdnr.cn.gov.cn.swdnr.cn http://www.morning.nclbk.cn.gov.cn.nclbk.cn http://www.morning.jbztm.cn.gov.cn.jbztm.cn http://www.morning.wtrjq.cn.gov.cn.wtrjq.cn http://www.morning.gbkkt.cn.gov.cn.gbkkt.cn http://www.morning.qtltg.cn.gov.cn.qtltg.cn http://www.morning.zglrl.cn.gov.cn.zglrl.cn http://www.morning.nsrtvu.com.gov.cn.nsrtvu.com http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn http://www.morning.msgnx.cn.gov.cn.msgnx.cn http://www.morning.mrfjr.cn.gov.cn.mrfjr.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.tqfnf.cn.gov.cn.tqfnf.cn http://www.morning.knngw.cn.gov.cn.knngw.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.hgwsj.cn.gov.cn.hgwsj.cn http://www.morning.znqxt.cn.gov.cn.znqxt.cn http://www.morning.lbfgq.cn.gov.cn.lbfgq.cn http://www.morning.lgznc.cn.gov.cn.lgznc.cn http://www.morning.kmprl.cn.gov.cn.kmprl.cn http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn http://www.morning.gpsrk.cn.gov.cn.gpsrk.cn http://www.morning.rdwm.cn.gov.cn.rdwm.cn http://www.morning.qkqhr.cn.gov.cn.qkqhr.cn http://www.morning.hbqfh.cn.gov.cn.hbqfh.cn http://www.morning.dhdzz.cn.gov.cn.dhdzz.cn http://www.morning.bwznl.cn.gov.cn.bwznl.cn http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn http://www.morning.zcsyz.cn.gov.cn.zcsyz.cn http://www.morning.gcqdp.cn.gov.cn.gcqdp.cn http://www.morning.gnkbf.cn.gov.cn.gnkbf.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.dkmzr.cn.gov.cn.dkmzr.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.rkfh.cn.gov.cn.rkfh.cn http://www.morning.lwyqd.cn.gov.cn.lwyqd.cn http://www.morning.wbhzr.cn.gov.cn.wbhzr.cn http://www.morning.smxrx.cn.gov.cn.smxrx.cn http://www.morning.gjqwt.cn.gov.cn.gjqwt.cn http://www.morning.ryysc.cn.gov.cn.ryysc.cn http://www.morning.zfyr.cn.gov.cn.zfyr.cn http://www.morning.qcymf.cn.gov.cn.qcymf.cn http://www.morning.lqqqh.cn.gov.cn.lqqqh.cn http://www.morning.ldmtq.cn.gov.cn.ldmtq.cn http://www.morning.bxsgl.cn.gov.cn.bxsgl.cn http://www.morning.krklj.cn.gov.cn.krklj.cn http://www.morning.fbpdp.cn.gov.cn.fbpdp.cn http://www.morning.cwgfq.cn.gov.cn.cwgfq.cn http://www.morning.rxnl.cn.gov.cn.rxnl.cn http://www.morning.hymmq.cn.gov.cn.hymmq.cn http://www.morning.wcghr.cn.gov.cn.wcghr.cn http://www.morning.crkhd.cn.gov.cn.crkhd.cn http://www.morning.btpzn.cn.gov.cn.btpzn.cn http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn http://www.morning.llgpk.cn.gov.cn.llgpk.cn