1、创建 submitlock 注解
@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @interface submitlock {
string key() default "";
}2、注解实现
@autowired
public redisutils redisutils;
@around("execution(* com.example.code_generation..*controller.*(..)) && @annotation(lock)")
public object submitinterceptor(proceedingjoinpoint pjp, submitlock lock) {
servletrequestattributes attributes = (servletrequestattributes) requestcontextholder.getrequestattributes();
httpservletrequest request = attributes.getrequest();
string uri = request.getrequesturi();
methodsignature signature = (methodsignature) pjp.getsignature();
method method = signature.getmethod();
//真实类名字
string targetname = pjp.gettarget().getclass().getname();
//真实方式
string methodname = pjp.getsignature().getname();
//所有的请求参数
object[] arguments = pjp.getargs();
object[] args = new object[arguments.length];
submitlock locallock = method.getannotation(submitlock.class);
string key = setkey(locallock.key(), pjp.getargs());
if (!stringutils.isempty(key)) {
if (redisutils.get(key) != null) {
log.error("请勿重复操作,uri = 【{}】", uri);
return new rspdata<>(bizcodeenum.warn, "请勿重复操作");
}
redisutils.set(key,key,2);
}
object result = null;
try {
result = pjp.proceed();
return result;
}catch (throwable throwable){
throw new runtimeexception("服务器异常");
}finally {
int order = 0;
for (object arg : arguments){
if (arg instanceof servletrequest || arg instanceof servletresponse || arg instanceof multipartfile){
continue;
}
args[order] = arg;
order ++ ;
}
log.info("调用controller方法返回结果,targetname = {}, methodname = {}, args = {}, result = {}",
targetname, methodname, args, result);
}
}
private string setkey(string keyexpress, object[] args) {
if (null != args && args.length > 0) {
keyexpress = keyexpress.replace("arg[0]", args[0].tostring());
}
return keyexpress;
}
3、controller 测试验证
@submitlock(key = "gettest")
@apioperation(value = "获取代办任务")
@getmapping("gettest")
public object gettest(@currentuser userinfo userinfo) {
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论