Json
json--JavaScript object notation (js对象表现形式)
在后端将java对象转为json格式的字符串
有很多第三方组件,可以直接将java对象转为json格式的字符串
new objectMapper().writeValueAsString(); 返回string类型
<!-- jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
网络请求
axios 是一个 HTTP 的网络请求库.
安装 npm install axios
在 main.js 中配置 axios 导入 axios import axios from 'axios';
设置访问后台服务器地址 axios.defaults.baseURL="http://127.0.0.1:9999/api/";
将 axios 挂载到 vue 全局对象中,使用 this 可以直接访问 Vue.prototype.$http=axios;
使用 get 或 post 方法即可发送对应的请求 then 方法中的回调函数会在请求成功或失败时触发 通过回调函数的形参可以获取响应内容,或错误信息
基本语法
this.$http.get(地址?Key=value&key2=val1).then(function(response){ }
this.$http.post("login",{key:"value",key2:"val2"}).then(function(response){ }
axios 的常用 API
get:查询数据
post 添加数据
put:修改数据
delete:删除数据
axios 的响应结果
响应结果的主要属性:
data:实际响应回来的数据
headers:响应头信息
status:响应状态码
statusText:响应状态信息
路由导航守卫
1.登陆成功后,在前端获取到后端响应的信息 ,前端存储用户信息
2.在前端判断用户是否登录
目前除了访问login.vue是不需要登录,除此之外的组件都必须是登录后才能访问
使用的vue-router中的路由导航守卫,在前端每次发生路由跳转时会触发拦截判断访问哪些组件,哪些组件需要登录,哪些组件不需要登录
3.在main路由下,嵌套其他子路由(需在main的菜单栏中加入router 以便于可以点击响应,还需在main区域添加<router-view></router-view> 可以显示相应的子路由组件)
4.后端如何判断用户身份?
web会话跟踪
什么是会话 ?
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务 器结束,被称为一个会话。
为什么要会话跟踪?
因为http请求是无状态的,一次请求响应结束后,就结束了,下一次再向服务器端发送请求,服务器并不知道是谁向他发送的
我们需要对整个会话过程进行跟踪.
token
token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后, 服务器生成一个token便将此token返回给客户端,以后客户端只需带上这个token前来 请求数据即可。token保存在客户端,并且进行了加密,保证了数据的安全性
目的:token的目的是为了减轻服务器的压力,使服务器更加健壮
JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON
的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON
对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC
算法或者是RSA
的公私秘钥对进行签名。
JWT**就是用来生成token的一种方式,一种可以携带用户信息,并且可以设置秘钥加密的字符串,是安全的.**
起源
以前的session认证,是将用户信息存储在服务器端. 在服务器生成httpSession对象,对前端返回httpsession对象的编号
弊端:1.占用服务器内存2.分布式项目中,不灵活
传统的session认证
我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。
但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.
基于session认证所显露的问题
Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
CSRF (**跨站请求伪造):**因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
基于token的鉴权机制
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
会话过程:
1.当登录时,后端验证账号密码是否正确,如果正确,就需要为当前用户生成一个令牌(token),,将令牌信息响应给前端
2.前端存储token
3.后面每次从前端向后端发送请求,都要携带token
4.后端验证令牌,如果令牌有效,继续向后执行,若令牌无效,向前端响应认证无效
JWT的主要应用场景
身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。
优点
1.**简洁(Compact): 可以通过URL
,POST
参数或者在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>
base64
一、概述
Base64就是一种基于64个可打印字符来表示二进制数据的方法,在网络上最常见的用于传输8Bit字节码的编码方式之一;网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送; 这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了;最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示。
二、原理
1**、索引表**
2.**转换步骤**
a)将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
b)将上面的24个二进制位每6个一组,共分为4组。
c)每组再转化为十进制,根据Base64编码对照表(见上图)获得对应的值。
案例:
假设我们要对 Hello! 进行Base64编码,按照ASCII表,其转换过程如下图所示:
三、 base64 编码使用场景
公钥证书
对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
文本传输
一个xml当中包含另一个xml数据,此时如果将xml数据直接写入显然不合适,将xml进行适当编码存入较为方便,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,那么怎么办呢?可以使用base64进行编码,然后存入xml,解码反之其实还有个办法,将byte的值写在xml当中,空格或者,分开,这样也可以将byte数据传入,不过这样更浪费空间,并且不易保存.另一个,
HTTP**协议**
http协议当中的key value字段,必须进行URLEncode 不然出现的等号可能使解析失败 空格也会使http请求解析出现问题,比如 请求行就是以空格来划分的 POST /guowuxin/hehe HTTP/1.1
电子邮件(SMTP协议)
有些文本协议不支持不可见字符的传递,只能用大于32的可见字符来传递信息(协议规定)
图片base64编码
前端在实现页面时,对于一些简单图片,通常会选择将图片内容直接内嵌在页面中,避免不必要的外部资源加载,增大页面加载时间,但是图片数据是二进制数据,该怎么嵌入呢?绝大多数现代浏览器都支持一种名为 Data URLs 的特性,允许使用Base64对图片或其他文件的二进制数据进行编码,将其作为文本字符串嵌入网页中。
四、误区
可能会有人在不理解Base64编码的情况下,将其误用于数据加密或数据校验。
Base64是一种数据编码方式,目的是让数据符合传输协议的要求。标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。