1.数据库事务
概念:
数据库的事务是一种机制,一个操作序列,包含了一组数据库的操作命令;事务把所有的命令都作为一个整体一起向系统提交或撤销操作,即这一组数据库命令要么同事成功,要么同时失败;我们把事务看作是一个不可分割的工作逻辑单元;
事务管理关键字:
MySQL事务管理:
--开启事务 --START TRANSACTION 或者 BEGIN;
--提交事务 --COMMIT;
--回滚事务 --ROLLBACK;
JDBC事务管理:Connection接口定义了3个对应的方法:
--开启事务 :setAutoCommit(boolean) :true为自动提交事务;false为手动提交事务,即开启事务;
--提交事务 :commit();
--回滚事务 :rollback();
在java里面使用异常处理机制 try catch来进行事务运行管理的代码编写;
事务的四大特征:
原子性(Automicity):事务是不可分割的最小操作单位,要么同时成功,要么失败;
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态(数据总额不发生变化);
隔离性(Isolation):多个事务(多个操作窗口)之间,操作的可见性;隔离性越强,操作越不可见,性能越低,反之性能越高;
持久性(Durability):事务一旦提交或者回滚,它对数据库的改变就是永久的;
事务的默认自动提交:
我们知道在进行数据更改的时候,数据是会实时变更的,这是因为数据库默认就是自动提交数据的;
可以通过:select @@autocommit;语句来查询它的提交方式,默认的值是1;
可以通过:set @@autocommit = 0;语句来修改它的提交方式为手动,这样如果要永久性地修改数据,
就必须要手动提交;
在spring mvc模型里,在service层里通过加注解:@Transactional ,该注解可用于方法、实现类、接口上,被注解的方法需要声明在接口里面,因为该注解是基于动态代理实现的,就是在方法前后增加开启,提交事务的逻辑,而事物的回滚基于异常的捕捉
2.分清cookie,session,token
2.1、基础概念
Http是一种无状态的协议(对于事务处理没有记忆能力,服务端不会保存任何会话信息,如果想要跟踪会话,需要主动维护一个信息去保留会话信息,这个信息可以是cookie或者session)
现在上网想要对服务器发送请求一般都要进行登录操作,而登录操作以及后续请求是基于认证、授权与凭证这几种操作;
认证 (Authentication):通俗来说,就是证明自己的身份,一般用于登录操作、手机接收验证码;
授权(Ahthorization):用户授予第三方应用访问该用户某些资源的权限,实现授权的方式有:cookie,session,token;
凭证(Credentials):实现认证与授权的前提,是一种媒介(证书)来标记发起请求者的信息;比如在博客、微博上,未登录的游客可以看帖,但发帖需要登录,是基于凭证来区分有没有登录的;
2.2、Cookie
cookie是服务器发送给客户端并保存在客户端本地的信息,它会随着客户端的下一次请求一起被送给服务器;cookie是不可跨域的,每个cookie都会绑定一个单一的域名,无法在别的域名下获取使用(一级域名和二级域名之间允许共享);
属性 | 说明 |
name=value | 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型 - 如果值为 Unicode 字符,需要为字符编码。 - 如果值为二进制数据,则需要使用 BASE64 编码。 |
domain | 指定 cookie 所属域名,默认是当前域名 |
path | 指定 cookie 在哪个路径(路由)下生效,默认是 '/'。如果设置为 /abc ,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read 。 |
maxAge | cookie 失效的时间,单位秒。如果为整数,则该 cookie 在 maxAge 秒后失效。如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie 。如果为 0,表示删除该 cookie 。默认为 -1。 |
expires | 过期时间,在设置的某个时间点后该 cookie 就会失效。一般浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除 |
secure | 该 cookie 是否仅被使用安全协议传输。安全协议HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。 |
httpOnly | 如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全 |
2.3、session
session是基于cookie实现的,是一种记录会话状态的机制,session是储存到服务器端里,但会发送sessionID给客户端的cookie里,并记录它的域名,等到客户端下次发送请求给服务器时,会先判断该域名下是否存在cookie,如果存在就发送cookie给服务器,里面携带了sessionID,通过sessionID查找对应的session,就可以重新建立会话状态;这种技术通常用于登录验证;
session与cookie的区别:
- 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
- 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
- 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
- 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。
2.4、Token
是一种访问资源时所需的凭证,简单的token由uid(用户唯一身份标识)、time(当前时间戳)、sign(签名),它的特点有:
- 服务端无状态化、可扩展性好
- 支持移动端设备
- 安全
- 支持跨程序调用
- 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
- 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
- token 完全由应用管理,所以它可以避开同源策略
Token的身份验证流程
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
- 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 token
- 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据
Token 和 Session 的区别
- Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌,访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。
- 作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了,因为session的信息安全保障在于sessionID的未知,sessionID却只能保存在本地,不应该共享给第三方,因此session是不允许客户端去共享数据或者API接口给第三方,而token却能做到这一点,并保证了安全;
2.5、JWT
JSON WEB TOKEN,是目前最流行的跨域认证的解决方案;
它是一种基于JSON,为了在网络应用环境间传递声明而执行的一种标准(RFC 7519);例如:在用户和服务器间传递被认证的用户身份信息,以便于从服务器获取资源。
JWT的认证流程
JWT的特点
- 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
- 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了查询数据库的需要
- 因为 JWT 并不使用 Cookie ,所以你可以使用任何域名提供你的 API 服务,而不需要担心跨域资源共享问题(CORS)
- 因为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制
JWT的使用方式:
- 存储在cookie里,这种方式可以随cookie而自动发送出去,缺点是无法做跨域访问;
- 存在HTTP请求头的Authorization字段里,通过Bearer模式添加JWT;它的优点是不担心跨域资源共享问题(CORS);
- 存在POST请求的数据体里;
- 存在URL里面;
TOKEN与JWT的区别:
相同点:
都是访问资源的令牌;都可以记录用户的信息;都是使服务器无状态化(可以使服务器不用存状态信息);可以对请求做验证;
不同点:
token需要查询查询数据库以验证用户信息;JWT是将TOKEN与PAYLOAD(载荷)加密,服务端只需要使用密钥进行解密并检验,就可以完成验证,不需要查询数据库;