在客户端网络慢或者服务器响应慢时,用户有时是会频繁刷新页面或重复提交表单的,这样是会给服务器造成不小的负担的,同时在添加数据时有可能造成不必要的麻烦。所以我们在后端也有必要进行防抖操作。
1.自定义注解
/** * @author tzeao */ @target(elementtype.method) // 作用到方法上 @retention(retentionpolicy.runtime) // 运行时有效 public @interface norepg key, t value) { valueoperations operation = redistemplate.opsforvalue(); operation.set(key, value); return operation; } /** * 缓存基本的对象,integer、string、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 * @param timeout 时间 * @param timeunit 时间颗粒度 * @return 缓存的对象 */ public valueoperations setcacheobject(string key, t value, integer timeout, timeunit timeunit) { valueoperations operation = redistemplate.opsforvalue(); operation.set(key, value, timeout, timeunit); return operation; } /** * 获得缓存的基本对象。 * * @param key 缓存键值 * @return 缓存键值对应的数据 */ public t getcacheobject(string key) { valueoperations operation = redistemplate.opsforvalue(); return operation.get(key); } /** * 删除单个对象 * * @param key */ public void deleteobject(string key) { redistemplate.delete(key); } /** * 删除集合对象 * * @param collection */ public void deleteobject(collection collection) { redistemplate.delete(collection); } /** * 缓存list数据 * * @param key 缓存的键值 * @param datalist 待缓存的list数据 * @return 缓存的对象 */ public listoperations setcachelist(string key, list datalist) { listoperations listoperation = redistemplate.opsforlist(); if (null != datalist) { int size = datalist.size(); for (int i = 0; i < size; i ) { listoperation.leftpush(key, datalist.get(i)); } } return listoperation; } /** * 获得缓存的list对象 * * @param key 缓存的键值 * @return 缓存键值对应的数据 */ public list getcachelist(string key) { list datalist = new arraylist<>(); listoperations listoperation = redistemplate.opsforlist(); long size = listoperation.size(key); for (int i = 0; i < size; i ) { datalist.add(listoperation.index(key, i)); } return datalist; } /** * 缓存set * * @param key 缓存键值 * @param dataset 缓存的数据 * @return 缓存数据的对象 */ public boundsetoperations setcacheset(string key, set dataset) { boundsetoperations setoperation = redistemplate.boundsetops(key); iterator it = dataset.iterator(); while (it.hasnext()) { setoperation.add(it.next()); } return setoperation; } /** * 获得缓存的set * * @param key * @return */ public set getcacheset(string key) { set dataset = new hashset<>(); boundsetoperations operation = redistemplate.boundsetops(key); dataset = operation.members(); return dataset; } /** * 缓存map * * @param key * @param datamap * @return */ public hashoperations setcachemap(string key, map datamap) { hashoperations hashoperations = redistemplate.opsforhash(); if (null != datamap) { for (map.entry entry : datamap.entryset()) { hashoperations.put(key, entry.getkey(), entry.getvalue()); } } return hashoperations; } /** * 获得缓存的map * * @param key * @return */ public map getcachemap(string key) { map map = redistemplate.opsforhash().entries(key); return map; } /** * 获得缓存的基本对象列表 * * @param pattern 字符串前缀 * @return 对象列表 */ public collection keys(string pattern) { return redistemplate.keys(pattern); } /** * @param key * @return */ public boolean haskey(string key) { return redistemplate.haskey(key); } public long getexpire(string key) { return redistemplate.getexpire(key); } public valueoperations setbillobject(string key, list
4.测试
@norepeatsubmit(name = "test") // 也可以不给名字,这样就会走默认名字 @getmapping("test") public result test() { return result.success("测试阶段!"); }
15秒内重复点击就会给提示
这样就完成了一个防止重复提交、频繁申请的程序
参考:
https://blog.csdn.net/chengmin123456789/article/details/107982095
到此这篇关于java后端防止频繁请求、重复提交的文章就介绍到这了,更多相关java重复提交内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
展开全文