誉天程序员-2301-3-2-day03

知识回顾

5. 幂等

5.1. 幂等
数学中幂等就是多次运算结果一致,对应到实际工作的软件或者网络环境中就是同一个操作不管你操作多少次结果是一样的。我们在编程过程中会看到一些幂等是天然存在的。
5.2. 为什么会产生幂等问题
幂等问题之所以产生无外乎重复点击或者网络重发,比如:

  1. 点击提交按钮两次
  2. 操作进行的时候点击了刷新按钮
  3. 在浏览器中后退后重复之前的操作,导致重复提交表单
  4. Nginx重发
  5. 分布式RPC环境的try重发,SpringCloud它组件会自动重发
  6. 消息重复消费,使用MQ消息中间件的时候,消息中间件错误没及时提交,导致重复消费。

5.3. SQL 幂等
SQL中例子:
select查询操作
delete删除操作其中的根据某个key值删除(不关注结果)
update更新某个字段值
(一般第一条处理数据,后面的多条不会产生副作用就是幂等)

5.4. HTTP 幂等
幂等性:HTTP/1.1中的定义是指一次和多次请求某一个资源对于资源(uri,/user/save,/user/delete/666)本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
http协议明确规定,put、get与delete请求都是具有幂等性的,而post为非幂等性请求,就是说接口被定义为post请求可访问时,说明这个接口对数据库的影响是非幂等性的。所以一般插入新数据时,用post方法,更新数据库时,用put方法。(新增采用自增主键,这个问题特别突出,反复刷新页面,主键会次+1,会增加多条记录到数据库。)

5.5. Spring 支持幂等(SpringMVC)
Spring4.3中引进了{@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping} 来帮助简化常用的HTTP方法的映射并更好地表达被注解方法的语义,至于@PatchMapping可以暂时不用管,Patch方式是对put方式的一种补充,put方式是可以更新.但是更新的是整体.patch是对局部更新;

关注几个重点:
 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。
 幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。
 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。
 网络超时等问题,不是幂等的讨论范围。

5.6. 小结
幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。
以SQL为例,有下面三种场景,只有第三种场景需要开发人员使用其他策略保证幂等性:
 SELECT col1 FROM tab1 WHER col2=2,无论执行多少次都不会改变状态,是天然的幂等。
 UPDATE tab1 SET col1=1 WHERE col2=2,无论执行成功多少次状态都是一致的,因此也是幂等操作。
 UPDATE tab1 SET col1=col1+1 WHERE col2=2,每次执行的结果都会发生变化,这种不是幂等的。
简单来说就是多次访问对rest服务产生的结果不会有改变。

密码加密

最常见md5,SQL也支持 ,Spring框架也支持。
SELECT MD5(‘123456’)
e10adc3949ba59abbe56e057f20f883e
md5不可逆,但是我们死记忆常用密码md5值,然后你可以得到项目的数据库,去查询它的登录表user,如果看到密码为这个值的,那你就知道了它的登录名和密码。

vfoxbase,数据库

md5它是hash算法,hash散列。尽量平均分配。(分布式架构)
md5理论上唯一值。不同的密码,md5的值不同。有可能不同的值经过md5得到相同的值。如果发生了上面这个情况,把这种方式叫hash碰撞。

md5不可逆,有个中国女教授宣称破解md5。不安全。
主流方式md5(‘123456’+username)加盐salt,(盐变化)
Apache Shiro,Spring Security 安全框架,底层实现就是上面的方式。

分页

1)分页原理,数据库都支持,只是实现方式不同。SQL没有标准。
2)分页可以抽象为标准的工具类。自己写工具类,你的执行自己SQL。框架就实现了分页。MybatisPlus它封装了SQL,封装了分页支持。
3)IPage,和日常对象不同,recordes(返回的某页数据)、size(每页的条数)、total(总记录数)。
4)需要加一个拦截器interceptor。放在不同项目中,包扫码问题。
运行类com.bank.admin.RunApp,依赖com.bank.mybaitsplus.config
a.解决办法:把RunApp移动到它们共有的包路径下:com.bank
b.解决办法:增加包扫码路径。默认包扫码当前路径和子包。额外加注解@ComponentScan(“com.bank.mybatisplua.config”) 以前SpringBoot版本可以,但新的不行。@ComponentScans(@ComponentScan(“com.bank.mybatisplua.config”) )
新版语法发生变化。(不向下兼容)

你可能感兴趣的:(誉天程序员,ssm,frame,三大框架,java)