赞
踩
会话:用户打开浏览器,访问web服务器资源,会话建立,直到有一方断开连接,会话结束,在一次会话中可以包含多次请求和响应。同一浏览器的多次请求属于同一个会话,当服务器关闭的时候所有会话结束。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话的多次请求之间共享数据。(即一次登录之后,之后的所有操作都在之前已经登录的基础之上进行)http协议是无状态的,两次请求之间都是独立的,因此我们在服务器端无法通过http协议来区分两次请求是否来自同一会话,所以同一会话的多次请求之间是无法进行数据共享的,要想共享数据需要使用会话跟踪技术。
会话跟踪方案
客户端会话跟踪技术:cookie -----数据存储在客户端浏览器中
服务端会话跟踪技术:session 数据存储在服务器当中
令牌技术 -- JSON WEB Token
在第一次发起请求的时候设置一个变量,将用户需要保存的信息存放在变量中去,之后响应给浏览器(放在响应头)代码如下response.addCookie(),浏览器将cookie中的数据存储到本地,之后的所有请浏览器会自动携带本地的cookie数据到服务器端(放在请求头)。
优点:http协议中支持的技术(可直接在response中设置,在resquest中获取)
缺点:①移动端app无法使用
②不安全(可以直接查看),用户可以自动禁用cookie(禁用之后cookie就失效了)
③Cookie不能跨域——IP/域名,协议,端口号其中有一个不同就属于跨域(如果前后端部 署在不同的服务器上面,在一个服务器上面定义则另一个服务器则不能使用)
当用户第一次请求服务器的时候会在服务器端设置一个会话对象Session,每一个session又有一个id即SessionID,之后服务器在响应数据的时候会将这个ID(JSESSIONID)以cookie的方式响应给浏览器,浏览器会将这个ID存储在本地(此时的浏览器只存储JSESSIONID),之后的每次请求会携带这个ID,服务器会根据这个ID从众多会话对象中找到一个,这样就可以共享数据。
优点:存储在服务器端-安全
缺点:①现在项目部署在多台服务器上面(可能一开始将数据存储在第一台服务器,再次请求的 时候 由于负载均衡请求被第二台服务器处理,但是数据没有在该服务器上面存储 )
②由于基于cookie,cookie的缺点它也有
通信的双方以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的使用需要引入依赖
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt</artifactId>
- <version>0.9.1</version>
- </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课程进行总结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。