web会话跟踪(JWT是什么)

web会话跟踪(JWT是什么):

一.使用会话跟踪的原因:

因为http请求是无状态,一次请求响应结束后,就结束了,下一次再向服务器端发送请求,服务器并不知道是谁向他发送的

所以我们需要对整个会话过程进行跟踪

二.token:

● token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后, 服务器生成一个token便将此token返回给客户端,以后客户端只需带上这个token前来 请求数据即可。token保存在客户端,并且进行了加密,保证了数据的安全性.

● 目的:token的目的是为了减轻服务器的压力,使服务器更加健壮。

三.过程:

1.当登录时,后端验证账号密码是否正确,如果账号正确,就需要在后端为当前登录的用户生成一个令牌(token),将令牌信息响应给前端。

2.前端存储token

3.后面每次从前端向后端发送请求,都要携带token

4.后端验证令牌,如果令牌有效,继续向后执行。如果令牌无效,向前端响应认证失败,让重新登录。

JWT:

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON**对象的形式安全的传递信息。**因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

Id–>token 秘钥-签名 abc

JWT就是用来生成token的一种方式,一种可以携带用户信息,并且可以设置秘钥加密的字符串,是安全的.**

流程:

1. 用户使用账号和密码发出post请求;
2. 服务器使用私钥创建一个jwt;
3. 服务器返回这个jwt给浏览器;
4. 浏览器将该jwt串在请求头中像服务器发送请求;
5. 服务器验证该jwt;
6. 返回响应的资源给浏览器。

JWT的主要应用场景

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

优点

1.简洁(Compact): 可以通过**URLPOST参数或者在HTTP header发送,因为数据量小,传输速度也很快
2.自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库
3.因为
Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。
4.不需要在服务端保存会话信息,特别适用于分布式微服务。

JWT的构成:

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 用户的信息),第三部分是签证(signature).

第一部分

header

jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC HS256

完整的头部就像下面这样的JSON:

{‘typ’: ‘JWT’,‘alg’: ‘HS256’}–>重新进行编码(不是加密)

然后将头部进行base64转码,构成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

第二部分

playload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

· 标准中注册的声明

· 公共的声明

· 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务 需要的必要信息.但不建议添加敏感信息(例如密码),因为该部分在客户端可解密. id,用户名,头像名

· 私有的声明

定义一个payload

{ “sub”: “1234567890”, “name”: “John Doe”,“admin”: true}

然后将其进行base64转码,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

第三部分

signature

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

· header (base64后的)

· payload (base64后的)

· secret

这个部分需要base64转码后的header和base64转码后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT搭建

引入JWT依赖,由于是基于Java,所以需要的是java-jwt
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.8.2</version></dependency>
创建生成token的方法:
 * jwt生成token* @param id* @param account* @return*/public static String token (Integer id, String account){String token = "";try {//过期时间 为1970.1.1 0:0:0 至 过期时间  当前的毫秒值 + 有效时间Date expireDate = new Date(new Date().getTime() + 10*1000);//秘钥及加密算法Algorithm algorithm = Algorithm.HMAC256("xxxxxxxxxxxxxxxx");//设置头部信息Map<String,Object> header = new HashMap<>();header.put("typ","JWT");header.put("alg","HS256");//携带id,账号信息,生成签名token = JWT.create().withHeader(header).withClaim("id",id).withClaim("account",account).withExpiresAt(expireDate).sign(algorithm);}catch (Exception e){e.printStackTrace();return  null;}return token;}
验证token是否有效的方法:
public static boolean verify(String token){try {//验签Algorithm algorithm = Algorithm.HMAC256("xxxxxxxxxxxxxxxxxx");JWTVerifier verifier = JWT.require(algorithm).build();DecodedJWT jwt = verifier.verify(token);return true;} catch (Exception e) {//当传过来的token如果有问题,抛出异常return false;}}
获得token 中playload部分数据:
 /*** 获得token 中playload部分数据,按需使用* @param token* @return
*/
public static DecodedJWT getTokenInfo(String token){
return JWT.require(Algorithm.HMAC256("xxxxxxxxxxxxxxxx")).build().verify(token);
}

用户登录成功后将用户id和账号存储到token中返回给客户端,之后客户端每次请求将token发送到服务器端验证, 在服务器中进行验证.

前端此时发送请求:
var token=sessionstorage.getItem('token');
this.$http.get("/test?token="+token).then((resp)=>{
})
后端此时接收请求:
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("test doget");String token=req.getParameter("token");System.out.println(token);boolean verify= JWTUtil.verify(token);System.out.println(verify);if(verify){}else {}}

优化:

但如果我们每次在前端发送一次请求,后端总是使用verify来验证的话过于麻烦,所以我们需要在前端的过滤器中把token在每次请求后直接默认给请求头,然后在后端的过滤器中验证一次请求头中的token。

后端过滤器:

经过过滤器验证完token后直接跳转相应的servlet,没有这个过滤器的话就需要在每个servlet中添加验证

// 登录login的servlrt中不加api,需要验证登录没的servlet都加api前缀
// 这样子token之类的过滤器不会在login时加载
@WebFilter(urlPatterns="/api/*")
public class TokenFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// getHeader是HttpServletRequst中的HttpServletRequest request=(HttpServletRequest)servletRequest;//向下转型String token=request.getHeader("token");    //接收请求头中的tokenSystem.out.println("token验证过滤器");//验证tokenboolean res= JWTUtil.verify(token);if(res){//token验证成功,继续向后执行,到达目标servlet程序filterChain.doFilter(servletRequest,servletResponse);}else {//token验证失败,向前端响应401Result result=new Result(401,"token认证失败",null);   //权限认证失败servletResponse.getWriter().print(new ObjectMapper().writeValueAsString(result));}}
}
前端拦截器:

接下来我们需要在main.js里添加请求拦截,每当我们使用axios把框架向后端发送请求时,都会经过拦截器。把浏览器的token给请求头进行验证是否相同,相同则请求通过。

//axios 请求拦截,每当我们使用axios框架向后端发送请求时,都会经过拦截器
axios.interceptors.request.use(config=>{//为请求头对象,添加token验证的token字段//c.h.token的token是请求头中设置的token名
config.headers.token=window.sessionStorage.getItem('token');return config;
})
前端添加响应拦截器:

当后端响应回来的状态为401和500的时候需要拦截器拦截同意进行操作,不然就要在每次可能会出现401和500的情况下做出相应的操作,这样很麻烦。

//添加响应拦截器
axios.interceptors.response.use((resp)=>{	//正常响应拦截if(resp.data.code==401){ElementUI.Message({message:resp.data.desc,type:"error"})router.replace("/login");//用replace跳转返回不回去}if(resp.data.code==500){ElementUI.Message({message:resp.data.desc,type:"error"})}return resp;
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 配置Druid数据源及mysql

SpringBoot 配置Druid数据源及mysql 本文使用 druid-spring-boot-starter 方式 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version> </dependency>&…

Echarts圆环图偏移后 中心文字居中对齐实现

像上图中这样圆环图并不在div的中间时&#xff0c;中心的文本需要居中展示 一开始用left百分比但数据一旦变长或变短就会偏移 像这样 实在是太不美观了 所以我们这里使用动态的left通过文本的长度来计算 /*** 计算文本宽度* param {String|Number} text* param {String} font*…

js之图片上传

话不多说&#xff0c;直接上干货&#xff0c;注释在代码里面 下面是效果图和代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

[算法][数字][leetcode]2769.找出最大的可达成数字

题目地址 https://leetcode.cn/problems/find-the-maximum-achievable-number/description/ 题目描述 实现代码 class Solution {public int theMaximumAchievableX(int num, int t) {return num2*t;} }

第97天:权限提升-Web 权限权限划分源码后台中间件第三方数据库等

前置知识 具体有哪些权限需要我们了解掌握的 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 以上常见权限获取方法简要归类说明 后台权限&#xff1a;SQL 注入,数据库备份泄露&#xff0c;默认或弱口…

Qt | 内容边距(ContentsMargins)、间距(spacing)和 QSpacerItem 类

01、上节回顾 Qt | 布局管理器基础(QLayout)Qt | 布局部件拉伸(Stretch)原理及大小策略

Python | Leetcode Python题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution:def maxDepth(self, root: TreeNode) -> int:if not root: return 0queue, res [root], 0while queue:tmp []for node in queue:if node.left: tmp.append(node.left)if node.right: tmp.append(node.right)queue tmp…

Mybatis入门——其他查询操作和数据库连接池(4)

目录 一、多表查询 二、#{} 和 ${} 1、#{} 和 ${} 的使用 &#xff08;1&#xff09;Integer类型的参数 #{} 的使用 ${} 的使用 &#xff08;2&#xff09;使用String类型的参数 #{} 的使用 ${} 的使用 小结&#xff1a; 2、#{} 和 ${} 的区别 &#xff08;1&#…

太阳能语音监控杆(球机LED款)有什么用

传统监控设备依赖电力支持&#xff0c;在偏远地区和没有网络地区难以发挥其作用&#xff0c;而鼎跃安全的太阳能语音监控杆&#xff08;球机LED款&#xff09;在传统监控基础上&#xff0c;进行了全面优化&#xff0c;解决了无电无网区域使用受限的问题。 太阳能语音监控杆&am…

RSC英国皇家化学学会文献查找下载

英国皇家化学学会(Royal Society of Chemistry&#xff0c;简称RSC)是以促进全球化学领域研究发展与传播为宗旨的国际权威学术机构&#xff0c;是化学信息的一个重要宣传机关和出版商。RSC出版的期刊是化学领域的核心期刊&#xff0c;大部分被SCI和MEDLINE收录&#xff0c;如An…

浅谈JMeter作用域

浅谈JMeter作用域 JMeter是一款广泛使用的开源性能测试工具&#xff0c;它能够模拟多用户并发访问Web应用或其他系统的行为&#xff0c;以评估系统的性能和稳定性。在构建测试计划时&#xff0c;理解JMeter中的元件作用域与执行顺序至关重要。本指南将深入解析JMeter的作用域规…

K8s 1.25.4 高可用集群二进制部署(Runtime Containerd)

目录 一、集群环境准备 1.1 主机规划 1.2 软件版本 1.3 网络分配 二、集群部署 2.1主机准备 2.1.1 主机名设置 2.1.2 主机与IP地址解析 2.1.3 主机安全设置 2.1.4 交换分区设置 2.1.5 主机系统时间同步 2.1.6 主机系统优化 2.1.7 ipvs管理工具安装及模块加载 2.1…

腾讯云联络中心ivr调用自定义接口

1&#xff0c;java代码&#xff1a;http接口 RequestMapping(value "/getMsg5", method RequestMethod.POST) public Map<String, String> index(RequestBody Map<String, String> params) {String id params.get("id");HashMap<String…

渗透测试工具Cobalt strike-1.CS介绍与配置

Cobalt Strike是一款美国Red Team开发的渗透测试神器&#xff0c;常被业界人称为CS。最近这个工具大火&#xff0c;成为了渗透测试中不可缺少的利器。其拥有多种协议主机上线方式&#xff0c;集成了提权&#xff0c;凭据导出&#xff0c;端口转发&#xff0c;socket代理&#x…

目前无法解释的6个物理问题,每一个都困扰科学家很长时间

人类已经对宇宙有了大概的认知&#xff0c;不过即便如此&#xff0c;在宇宙中还有很多我们无法解释的物理问题&#xff0c;下面我们就一起来看看。 第一个无法解释的物理问题——虫洞真的存在吗&#xff1f; 虫洞最早是1916年由奥地利物理学家路德维希.费莱姆首次提出的&#…

登录记住密码背景颜色修改

1&#xff0c;在login.vue中&:-webkit-autofill里面的css替换成如下 &:-webkit-autofill {box-shadow: 0 0 0px 1000px $bg inset !important;-webkit-text-fill-color: $cursor !important;}

【自用题库】2024/华三/H3CNE安全GB0-510

【网工必备】华三H3CNE-安全-510 题库覆盖百分百&#xff0c;题库有291道总结汇总 还有vce加vce文件模拟真实考试环境 到手文件夹5样东西&#xff01;&#xff01;&#xff01; 认证简介&#xff1a;H3CNE-Security&#xff08;H3C Certified Network Engineer For Security&am…

什么是 Git 的 fork 命令?它和 clone 命令有什么区别?

实际上&#xff0c;Git 本身并没有一个名为 fork 的命令。Fork 是一种在代码托管平台(如GitHub、GitLab等)上进行协作开发的概念。 Fork 操作的本质是复制一个仓库到自己的账户下&#xff0c;这样你就能在自己的仓库中进行修改&#xff0c;而不影响原始仓库。当 你对自己仓库中…

6千古诗文必背名句大全ACCESS\EXCEL数据库

古诗&#xff0c;是古代诗歌的一种体裁&#xff0c;又称古体诗或古风&#xff0c;指的是产生于唐代以前并和唐代新出现的近体诗&#xff08;又名今体诗&#xff09;相对的一种诗歌体裁。其特点是格律限制不太严格。 从小我们就被教“熟读唐诗三百首,不会吟诗也会吟”&#xff…

linux环境下重置mysql密码以及1130 is not allowed to解决办法

​ 停止mysql服务 service mysqld stop 使用安全模式登陆&#xff0c;跳过密码验证 mysqld_safe --usermysql --skip-grant-tables --skip-networking& 登录 mysql -uroot mysql 修改密码 password括号内是要设置的密码 USE mysql; UPDATE user SET authentication_stringP…