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

网站建设二级页面方案中国建筑工程网官网登录

网站建设二级页面方案,中国建筑工程网官网登录,刚开今天新开传奇网站,网络营销最好的方法【全栈】SprintBootvue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量 1.是什么及其联系 Token、JWT令牌(JSON Web Token)、Redis和ThreadLocal变量在现代Web应用程序中常常被结合使用,尤…

【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量

1.是什么及其联系

Token、JWT令牌(JSON Web Token)、Redis和ThreadLocal变量在现代Web应用程序中常常被结合使用,尤其是在涉及用户认证与授权、会话管理以及并发处理等方面。下面解释它们之间的联系:

Token 和 JWT 令牌

  • Token:是一种用于标识用户身份的数据片段,通常是在用户成功登录后由服务器生成并返回给客户端。客户端随后会在每次请求时将这个token附带在请求头或请求参数中发送回服务器以证明其身份。
  • JWT (JSON Web Token):是一种特定类型的token格式,它允许你在一个紧凑且自包含的字符串中安全地传输信息作为JSON对象。JWT通常由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。JWT可以用来存储用户的认证信息,并且由于其具备签名特性,接收方能够验证内容是否被篡改。

Redis

  • Redis:是一个开源的内存数据结构存储系统,常被用作数据库、缓存和消息中间件。在Web应用中,Redis可以用来存储session数据或JWT令牌,以便快速访问和验证。例如,当用户登录时,可以生成一个JWT并将之存储在Redis中,同时设置过期时间。这样,后续请求只需查询Redis即可验证token的有效性,而无需每次都查询数据库。

ThreadLocal 变量

  • ThreadLocal:提供线程局部变量,每个使用该变量的线程都会拥有独立的副本,从而避免了多线程环境下的资源共享问题。在Web应用中,ThreadLocal变量可用于保存当前请求上下文中的某些状态信息,比如当前登录用户的详细信息等。这使得在整个请求生命周期内,这些信息可以在任何地方方便地获取,而不需要通过方法参数传递。

它们之间的联系

  1. 认证过程
    • 用户登录成功后,服务器生成一个JWT令牌,并可能将其存储在Redis中(为了便于管理和撤销),然后将此JWT返回给客户端。
  2. 请求处理
    • 当客户端发起请求时,会携带JWT令牌。服务器接收到请求后,首先从请求头中提取出JWT。
    • 接着,服务器可能会先检查Redis来确认JWT是否有效(如是否存在、是否已过期等)。如果Redis中存在该JWT,则继续处理请求;否则,可能需要重新登录或其他操作。
  3. 并发控制与安全性
    • 在请求处理过程中,为了保证线程安全,可以使用ThreadLocal变量来保存一些临时性的状态信息,比如当前请求解析出来的用户ID或者权限列表。这样做可以让这些信息在线程内部随时可用,同时也避免了多线程环境下可能出现的数据竞争问题。
  4. 性能优化
    • 使用Redis存储JWT令牌可以显著提高验证速度,因为Redis是基于内存的存储系统,查找速度远快于传统的数据库查询。
    • ThreadLocal变量则有助于减少不必要的对象传递,简化代码逻辑,特别是在复杂的业务场景下,能有效地提升开发效率和程序执行效率。

所以,Token(特别是JWT)用于用户的身份验证和授权,Redis用于高效地存储和检索这些令牌,而ThreadLocal变量则为单个请求线程提供了便捷的状态管理方式。三者结合起来,可以构建既安全又高效的Web服务架构。

2.在该项目中的应用

2.1.配置

使用它们之前首先要去配置它们,我们在application.yml进行Redis的配置,然后编写JWT令牌以及ThreadLocal的工具类

Redis
# application.yml
spring:data:redis:port: 6379host: localhost
JWT令牌以及ThreadLocal工具类

JwtUtil:

// JwtUtilpackage com.janium.minimallbe.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;import java.util.Date;
import java.util.Map;public class JwtUtil {private static final String KEY = "itheima";//接收业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)).sign(Algorithm.HMAC256(KEY));}//接收token,验证token,并返回业务数据public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}}

ThreadLocalUtil:

package com.janium.minimallbe.utils;/*** ThreadLocal 工具类*/
@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}

2.2.应用

我们登录时应该生成一个token,而生成token可以交给Jwt工具类,然后我们需要将生成的token储存在redis中。而且,为了方便直接获取到用户Id等信息,我们可以将token中的信息存储到ThreadLocal变量中。

UserController:

@PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{6,18}$") String username,@Pattern(regexp = "^\\S{6,18}$") String password){User u = userService.findByName(username);if(u == null){return Result.error("用户名错误");}if (u.getPassword().equals(Md5Util.getMD5String(password))) {// 1.设置token并将其储存到redis中Map<String, Object> claims = new HashMap<>();claims.put("id", u.getId());claims.put("username", username);String token= JwtUtil.genToken(claims);ValueOperations<String, String> operations = stringRedisTemplate.opsForValue(); // redis模板接口operations.set(token,token,12, TimeUnit.HOURS); // 将token存储到redis中return Result.success(token);}return Result.error("密码错误!");}

LoginInterceptor:

try {ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String redisToken = operations.get(token);if (redisToken == null) {throw new RuntimeException();}Map<String, Object> claims = JwtUtil.parseToken(token);// 1.如果登录成功则将token里的信息存入ThreadLocal变量中,以便后续使用ThreadLocalUtil.set(claims);return true;} catch (Exception e) {response.setStatus(401);return false;}}

3.总结

本期为细节解析期的第一期,补充了TokenJwt令牌、RedisThreadLocal变量等细节,下期将继续补充开发中的一些细节问题。


文章转载自:

http://suUAAStD.bgbnc.cn
http://vYdGiJah.bgbnc.cn
http://1ipStBcr.bgbnc.cn
http://pxgQx4Pi.bgbnc.cn
http://ZPbjAM9t.bgbnc.cn
http://BrieJzE6.bgbnc.cn
http://DysfetSc.bgbnc.cn
http://ALnk6Rek.bgbnc.cn
http://XNp2jQbR.bgbnc.cn
http://P45rJxuw.bgbnc.cn
http://6Jnw08du.bgbnc.cn
http://idnUHI9j.bgbnc.cn
http://36aWZJ6Q.bgbnc.cn
http://DLb9u2my.bgbnc.cn
http://gK7orstY.bgbnc.cn
http://rVYuAzPA.bgbnc.cn
http://VoSb6hfU.bgbnc.cn
http://FtPFmESq.bgbnc.cn
http://hdlg3gnK.bgbnc.cn
http://8NPGuuxR.bgbnc.cn
http://e40gEGFj.bgbnc.cn
http://5rGSJbwx.bgbnc.cn
http://PQccBfi2.bgbnc.cn
http://SdEeTg3D.bgbnc.cn
http://F0Te20BZ.bgbnc.cn
http://xK9hjeFs.bgbnc.cn
http://Ghkn4BHc.bgbnc.cn
http://tZ6vzC3l.bgbnc.cn
http://S0W3fqgw.bgbnc.cn
http://vTPP1LeE.bgbnc.cn
http://www.dtcms.com/wzjs/770575.html

相关文章:

  • 不用购买域名做网站WordPress当前菜单高亮
  • 腾讯视频网站源码做的网站没法用能否拒绝付工资
  • 做创新方法工作的网站wordpress机械主题
  • 购物网站php源代码wordpress 字符集 404
  • seo外包是什么意思优化营商环境心得体会个人
  • 公司备案证查询网站网页微博怎么发文章
  • 摄影网站建设内容久久文化传媒有限公司在哪里
  • 晋江wap站是什么意思o2o平台是什么意思啊
  • 包头网站制作公司wordpress后台缺少菜单
  • 企业把网站关闭原因滨州做网站推广
  • 世纪城网站建设ppt模板怎么做
  • 制作个人网站的要求怎么建设自己淘宝网站首页
  • 洛阳有哪些做网站的公司网站一年得多少钱
  • 网站建设需要什么硬件和软件有哪些方面永州市建设局网站
  • 网站主办者和所有者区别外发加工厂联系方式
  • 铜陵市网站建设网站制作培训中心
  • 廊坊网站建设总部在哪里东莞海边网站建设工作室
  • 怎么可以自己制作网站网络公司注册资金多少
  • 中国的平面设计网站网站死链对网站影响
  • 购物网站建设珠海如何在各网站做推广
  • 茶叶手机网站北京优化推广公司
  • 广元网站设计怎么查看什么公司做的网站
  • 网站建设最难的部分公司入口网站app
  • 各大网站网址网站设计上市公司
  • 学做土建资料员的网站哪个网站做视频有钱挣
  • 网站数据搬家建设p2p网站
  • 永兴县网站建设公司郑州代做网站
  • 平面设计培训费用一般是多少优化大师官网登录入口
  • 郑州企业网站建设公司wordpress支持多个站点地址
  • 家政保洁服务网站模板网站主体注销