接口幂等性实现方式之一

1.什么是接口幂等性?

接口程序多次执行所产生的影响均与一次执行的影响相同。

2.什么情况下要用到幂等性

在写入数据时,保证某个数据多次写入而数据库只插入一次数据,比如支付问题,用户支付一次就可完成商品交易,当网络卡顿时,用户多次点击付款按钮,最终只执行一次支付,避免重复支付给用户带来的经济损失。

3.使用拦截器实现接口幂等性

这里,模拟一个场景:在数据库中添加商品(name)与编号(code),code是商品的唯一标识id,不可重复,也就是说多次写入某个商品时数据库添加的数据只能有一个,避免了数据的重复性。

下面开始用拦截器实现功能:

首先,项目的代码(springboot项目)如下:

mapper:

public interface MiMapper {

/*

* 插入数据

* */

    int insert(Mi mi);

/*

* 查询

* */

    List find(String code);

}

MiMapper.xml:

<mapper namespace="com.example.mideng.mapper.MiMapper">

<insert id="insert" parameterType="com.example.mideng.pojo.Mi">

insert into t_mi(name,code) values (#{name},#{code})

</insert>

<select id="find" parameterType="String" resultType="com.example.mideng.pojo.Mi">

select code from t_mi where code=#{code}

</select>

</mapper>

service:

public interface MiService {

int insert(Mi mi);

/*

* 查询

* */

    List find(String code);

}

serviceImpl:

@Service

public class MiServiceImplimplements MiService {

@Autowired

    private MiMappermiMapper;

@Override

    public int insert(Mi mi) {

return miMapper.insert(mi);

}

@Override

    public List find(String code) {

return miMapper.find(code);

}

}

controller:

@Controller

public class WelcomeController {

@RequestMapping("/welcome")

public String wel(){

return "welcome";

}

}


@Controller

@RequestMapping("/mideng")

public class MiController {

@Autowired

    private MiServicemiService;

@RequestMapping("/tijiao")

public String tijiao(Mi mi){

int insert =miService.insert(mi);

return "ok";

}

@RequestMapping("/tip")

public String tip(){

return "tip";

}

}

html文件就不特意写出了,就是简单的数据提交,记得加上th:标签,因为我这是用的thymeleaf模板。

添加拦截器实现幂等

(1)首先自定义拦截器,这里思路是获取http中的code参数,然后在调用MiService 查询该code在数据库中是否已经写入,返回的是list,如果list的容量为0,说明数据表还没插入数据,那么返回true,否则重定向到提示界面并且返回false,不让程序往下执行。

@Component

public class MiDengIntercepterimplements HandlerInterceptor {

@Autowired

    private MiService miService;

@Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {

String code = request.getParameter("code");

List mi =miService.find(code);

if (mi.size()==0){

            return true;

}else {

response.sendRedirect("/mideng/tip");

return false;

}

}

}

(2)配置拦截器

拦截器写好后记得配置,这里添加的拦截路径只有一个,就是提交接口,提交接口实现的功能是将数据写入数据表

@Configuration

public class TiJiaoConfigureimplements WebMvcConfigurer {

@Autowired

    private MiDengIntercepter miDengIntercepter;

@Override

    public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(miDengIntercepter).addPathPatterns("/mideng/tijiao");

}

}


演示:

运行项目,访问http://localhost:8080/welcome


欢迎界面

先看下数据表,因为目前还没添加数据,所以是空的。


空表

开始写入:


点击添加:

查看数据库:

数据成功写入。下面继续添加,这时code仍是123


点击添加:

提示

会出现提示,查看数据库:

发现仍然只有一条数据,现在换一下名称看看效果:

code不变,名称改变

点击添加:

提示

查看数据库:

仍然只有一个

分析:因为是对code的拦截判断,所以表中不能有重复的code。下面换一下code试试:

code改变

点击添加:

查看数据库:

成功写入

继续:

点击添加:

查看数据库:

发现只要code不同就可插入数据,如果插入的code相同,那么无论点击多少次添加,都只能执行一次,所以简单的幂等实现也就完成了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容