储备知识
Http协议为什么称为无状态协议?
无状态,是指每一次请求都是独立的,下一次请求不会携带上次请求的数据。
而且浏览器与服务器的交互基于HTTP协议,无法判断用户状态。
会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中,可以包含多次请求和响应。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否源自同一个浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪的方案:
- 客户端会话跟踪技术:Cookie
优点:HTTP协议支持
缺点:移动端APP无法使用Cookie;不安全,用户可以自己禁用;不能跨域 - 服务器会话跟踪技术:Session(基于Cookie实现)
优点:Session存储在服务段,安全
缺点:服务器集群环境下无法直接使用Session;移动端APP无法使用Cookie;不安全,用户可以自己禁用;不能跨域 - 令牌技术
优点:支持PC、移动端;解决集群环境下的认证问题;减轻服务器的存储压力;
缺点:令牌生成、传递、校验较为繁琐
1.主流令牌技术-JWT
组成:
- Header头:记录令牌类型、签名算法等;
- Payload有效载荷:一些自定义信息、默认信息等;
- Signature签名:防止Token被篡改,确保安全性。将header、payload,并加入密匙,通过指定签名算法得到;
JWT依赖:
生成JWT令牌token:
解析令牌token:
注:
篡改令牌中的任意字符,在对令牌解析时都会报错;
2.过滤器Filter
- 过滤器是JavaWeb三大组件(Servlet,filter,Listener)之一;
- 过滤器可以把对资源的请求拦截下来,从而实现特殊的功能;
- 过滤器一般完成一些通用的操作,如:登录校验,通义编码处理,敏感字符处理等;
开发步骤:
1.获取请求url
2.判断请求url中是否包含login,如果包含,说明是登录操作,放行。3.获取请求头中的令牌(token)
4.判断令牌是否存在,如果不存在,响应401
5.解析token,如果解析失败,响应401
6.放行。
注:
如果过滤器中不执行放行操作,过滤器拦截到请求之后,就不会访问对应的资源。
放行:chain,doFilter(request response)
以登录校验为例:
3.拦截器
- 概念:一种动态拦截方法调用的机制,类似于过滤器。由Spring框架提供,主要用来动态拦截控制器方法的执行。
- 作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
开发步骤:
- 获取请求url
- 判断请求url中是否包含login,如果包含,说明是登录操作,放行
- 获取请求头中的令牌(token)
- 判断令牌是否存在,如果不存在,响应 401
- 解析token,如果解析失败,响应 401
- 放行
自定义拦截器:
实现HandlerInterceptor接口,并重写其所有方法
注:
- preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行
- postHandle方法:目标资源方法执行后执行
- afterCompletion方法:视图渲染完毕后执行,最后执行
注册配置拦截器:
过滤器与拦截器区别:
接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。