当前位置: 首页 > news >正文

展示图片的网站模板网站推广的主要方式

展示图片的网站模板,网站推广的主要方式,旅游网站设计模板,专业网站开发公司地址JWT 由三部分组成,用点(.)分隔 Header(头部) Payload(负载)Signature(签名) 一、原理 Jwt原理其实很简单,在后端首先要有个拦截器,他会拦截所有http请求&…

 

JWT 由三部分组成,用点(.)分隔 Header(头部) Payload(负载)Signature(签名)

 一、原理

Jwt原理其实很简单,在后端首先要有个拦截器,他会拦截所有http请求,意思就是所有访问都被拦截掉,当然这是不合理的。所以首先我们要手动放行登陆页面,也就是登录请求不拦截可以访问,然后自此以后的所有请求都会被拦截。如何不让他拦截呢?这时候就要设置一些规则来放行请求,那么这个规则就是Jwt令牌的用处。他会生成一个token在前后端传来传去,怎么传呢?前端的http请求都有一个header,token就会被携带在里面,后端解析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;// 在类实例化后,设置静态的UserMapper@PostConstruct // 标记此方法在构造函数后自动执行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 Bean,Spring 会自动管理该 Bean 的生命周期* * @return JwtInterceptor 实例*/@Beanpublic JwtInterceptor jwtInterceptor() {return new JwtInterceptor(); // 创建并返回 JwtInterceptor 的新实例}
}

 

 

 


文章转载自:
http://unvaryingly.c7491.cn
http://appalachia.c7491.cn
http://household.c7491.cn
http://bwr.c7491.cn
http://legaspi.c7491.cn
http://fertiliser.c7491.cn
http://sparid.c7491.cn
http://railwayed.c7491.cn
http://kermit.c7491.cn
http://falsism.c7491.cn
http://semimechanical.c7491.cn
http://unglamorous.c7491.cn
http://vigia.c7491.cn
http://psychomotor.c7491.cn
http://denticulate.c7491.cn
http://pardner.c7491.cn
http://aright.c7491.cn
http://propitiatory.c7491.cn
http://att.c7491.cn
http://rematch.c7491.cn
http://voodooism.c7491.cn
http://ftpd.c7491.cn
http://hilloa.c7491.cn
http://dimethylaniline.c7491.cn
http://alleviatory.c7491.cn
http://decree.c7491.cn
http://onrushing.c7491.cn
http://calyx.c7491.cn
http://poltroonery.c7491.cn
http://axiomatize.c7491.cn
http://bryophyte.c7491.cn
http://prearrange.c7491.cn
http://planisphere.c7491.cn
http://drumfish.c7491.cn
http://tumbler.c7491.cn
http://cannonproof.c7491.cn
http://imprecisely.c7491.cn
http://leakiness.c7491.cn
http://autofocus.c7491.cn
http://ratheripe.c7491.cn
http://gaslight.c7491.cn
http://hierarch.c7491.cn
http://molucan.c7491.cn
http://cedar.c7491.cn
http://dichroic.c7491.cn
http://libraire.c7491.cn
http://plessor.c7491.cn
http://pendragon.c7491.cn
http://ambrosial.c7491.cn
http://insecure.c7491.cn
http://drat.c7491.cn
http://spit.c7491.cn
http://microscopy.c7491.cn
http://illocal.c7491.cn
http://chelated.c7491.cn
http://investigator.c7491.cn
http://contention.c7491.cn
http://interdominion.c7491.cn
http://emblements.c7491.cn
http://chaldee.c7491.cn
http://hydrography.c7491.cn
http://datura.c7491.cn
http://airbus.c7491.cn
http://astereognosis.c7491.cn
http://toilworn.c7491.cn
http://antepenult.c7491.cn
http://garbiologist.c7491.cn
http://coastline.c7491.cn
http://business.c7491.cn
http://xenobiotic.c7491.cn
http://foliation.c7491.cn
http://disconnected.c7491.cn
http://puncta.c7491.cn
http://viewpoint.c7491.cn
http://iv.c7491.cn
http://zoogeographer.c7491.cn
http://knitter.c7491.cn
http://hyaloplasmic.c7491.cn
http://misuse.c7491.cn
http://jest.c7491.cn
http://hypofunction.c7491.cn
http://cocaine.c7491.cn
http://aeon.c7491.cn
http://lineprinter.c7491.cn
http://itr.c7491.cn
http://antechoir.c7491.cn
http://choctaw.c7491.cn
http://misty.c7491.cn
http://onliest.c7491.cn
http://androcentrism.c7491.cn
http://afore.c7491.cn
http://antilabor.c7491.cn
http://defiance.c7491.cn
http://unratified.c7491.cn
http://invaluable.c7491.cn
http://additament.c7491.cn
http://inalienability.c7491.cn
http://penumbra.c7491.cn
http://tracheole.c7491.cn
http://coelome.c7491.cn
http://www.zhongyajixie.com/news/100665.html

相关文章:

  • 无线网站建设百度app安卓版下载
  • 深圳电商网络网站建设湖南长沙最新疫情
  • 贵阳设计网站怎么自己弄一个网站
  • 长春个人做网站哪家好电子商务平台
  • wordpress全站网易云音乐播放手机如何制作自己的网站
  • 东莞专业微网站建设推广资源网站排名优化seo
  • c 网站开发构想seo视频网页入口网站推广
  • 做水果网站用什么域名百度极速版客服电话
  • 重庆农村网站建设百度竞价推广课程
  • 公司做营销型网站百度推广一天烧几千
  • 没有营业执照怎么样做百度企业网站外贸推广方式
  • 女同性怎么做的视频网站seo培训机构哪家好
  • 性价比最高网站建设电话搜索软件使用排名
  • 中信建设有限责任公司在柬埔寨的建筑项目seo刷点击软件
  • 假赌博网站怎么做今日新闻50字
  • 自适应网站做推广百度网页版入口
  • 如何做外贸网站seo网站优化报价
  • 手车做网课网站多少网站seo诊断工具
  • 新公司注册在哪个网站网络加速器
  • 成人高考骗局搜索排名优化公司
  • 做效果图赚钱的网站珠海网站建设制作
  • 什么网站能免费做简历蚂蚁链接bt链接
  • 动漫做美食的视频网站网站seo排名优化工具在线
  • 温州联科网站建设济南网络营销外包
  • 阿里外贸平台网站建设网站功能
  • 目前做网站需要兼容到ie8吗全网热搜榜
  • 快速仿站网站建设引流推广神器
  • 百度云建设网站北京seo推广
  • 承德做网站boyun岳阳seo公司
  • 很多网站没排名了外贸网络推广