当前位置:   article > 正文

会话技术-Cookie,Session,JWT

会话技术-Cookie,Session,JWT

简介 

会话:用户打开浏览器,访问web服务器资源,会话建立,直到有一方断开连接,会话结束,在一次会话中可以包含多次请求和响应。同一浏览器的多次请求属于同一个会话,当服务器关闭的时候所有会话结束。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话的多次请求之间共享数据。(即一次登录之后,之后的所有操作都在之前已经登录的基础之上进行)http协议是无状态的,两次请求之间都是独立的,因此我们在服务器端无法通过http协议来区分两次请求是否来自同一会话,所以同一会话的多次请求之间是无法进行数据共享的,要想共享数据需要使用会话跟踪技术。

会话跟踪方案

       客户端会话跟踪技术:cookie   -----数据存储在客户端浏览器中

       服务端会话跟踪技术:session        数据存储在服务器当中

       令牌技术 -- JSON WEB Token     

客户端会话跟踪技术:Cookie

       在第一次发起请求的时候设置一个变量,将用户需要保存的信息存放在变量中去,之后响应给浏览器(放在响应头)代码如下response.addCookie(),浏览器将cookie中的数据存储到本地,之后的所有请浏览器会自动携带本地的cookie数据到服务器端(放在请求头)。

 将用户信息保存到Cookie中

获取Cookie中的数据

优点:http协议中支持的技术(可直接在response中设置,在resquest中获取)

缺点:①移动端app无法使用

           ②不安全(可以直接查看),用户可以自动禁用cookie(禁用之后cookie就失效了)

           ③Cookie不能跨域——IP/域名,协议,端口号其中有一个不同就属于跨域(如果前后端部                署在不同的服务器上面,在一个服务器上面定义则另一个服务器则不能使用)

服务端会话跟踪技术:session-----底层还是基于cookie

      当用户第一次请求服务器的时候会在服务器端设置一个会话对象Session,每一个session又有一个id即SessionID,之后服务器在响应数据的时候会将这个ID(JSESSIONID)以cookie的方式响应给浏览器,浏览器会将这个ID存储在本地(此时的浏览器只存储JSESSIONID),之后的每次请求会携带这个ID,服务器会根据这个ID从众多会话对象中找到一个,这样就可以共享数据。

往HttpSession中存储数据

从HttpSession中获取数据

优点:存储在服务器端-安全

缺点:①现在项目部署在多台服务器上面(可能一开始将数据存储在第一台服务器,再次请求的                   时候 由于负载均衡请求被第二台服务器处理,但是数据没有在该服务器上面存储 )

           ②由于基于cookie,cookie的缺点它也有

令牌技术JWT ——JSON Web Token    

      通信的双方以json数据格式安全的传输信息,登录成功生成一个令牌,这个令牌就是用户身份的合法凭证,响应数据的时候就可以将令牌响应给前端,放在客户端,数据可以存储在cookie中也可以存储在其他数据结构当中,之后的每个请求都携带这个领牌,服务器端校验这个令牌的有效性,之后的多个请求操作可以通过令牌来共享数据——即将用户的信息以加密的方式存储在一个特殊的变量中——JSON Web Tokens - jwt.io

说明:用户登录成功后,设置JWT令牌,然后在后续的每次请求中,都需要在请求头header中携               带到服务端,请求头名称为token,值为登录时下发的JWT令牌

使用思路:

        令牌生成:用户登录成功后,生成JWT令牌,并返回给前端

        令牌校验:在请求到达服务端后,对令牌进行统一拦截 校验

JWT由三部分组成——每部分以.进行分割  

第一部分:Header,记录令牌类型,签名算法等,例如{"alg": "HS256","typ": "JWT"}

第二部分:Payload(有效负荷)携带一些自定义信息,例如{ "sub":                                                                 "1234567890", "name":"JohnDoe","iat": 1516239022}

第三部分:Signature签名,防止token被篡改.确保安全性

说明:密钥是以Base64进行编码的

可以自己尝试将以.号进行分割的每一部分去官网进行解码,官网样例如下

使用

①JWT的使用需要引入依赖

  1. <dependency>
  2. <groupId>io.jsonwebtoken</groupId>
  3. <artifactId>jjwt</artifactId>
  4. <version>0.9.1</version>
  5. </dependency>

②对JWT封装一下

说明:Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256,SignKey).setExpiration(new Date(System.currentTImeMillis()+expire)).compact();         

相当于new一个对象为里面的属性一一赋值(前提是要在对象的实体类上面加上@Builder注解),claims是需要传递的数据,签名基固定(但是生成与解析令牌时需要保持一致),expiration是过期时间,着重关注claims是需要传递的数据即可。

注意事项:JWT校验时使用的签名密钥,必须和生成JWT令牌时使用的密钥是配套的

                   如果JWT令牌校验时报错,则说明JWT令牌被篡改或失效了,令牌非法

过滤器

 

执行完doFikter方法之后需要放行,让它访问对应的方法

过滤器的执行流程

 

过滤器的拦截路径

过滤器登录检验

  

  

拦截器

步骤②中需要自己编写配置类

拦截器使用细节

路径配置

拦截器实现登录校验

  

注意;这里放行的操作是return true

过滤器与拦截器的区别于联系

 执行流程

 

注:上述内容根据hm-JavaWeb课程进行总结

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/737843
推荐阅读
相关标签
  

闽ICP备14008679号