?gitee地址(需要自取)AopProxy重復提交: 防止重復提交 (gitee.com)
@RestController
public class SubmissionController {@Autowiredprivate SubmissionService submissionService;private static Jedis jedis = new Jedis("localhost",6379);private String lock = "lock";private String lockValue = "locked";private int gqsj = 5;private String ok = "OK";@PostMapping("/submit")public void handleSubmitForm(@RequestParam String name, @RequestParam int age) {SubmissionService submissionServiceProxy = (SubmissionService) Proxy.newProxyInstance(submissionService.getClass().getClassLoader(), new Class[]{SubmissionService.class}, (proxy, method, args) -> {SetParams params = new SetParams();params.nx().ex(gqsj);String res = jedis.set(lock, lockValue,params);if (ok.equals(res)){Object invoke = method.invoke(submissionService,name,age);System.out.println("提交成功");return invoke;}else {System.out.println("不允許重復提交");return null;}});submissionServiceProxy.insert(name, age);// 存疑?第一天晚上return null后匯報一個空指針錯誤,奇怪的是第二天不報錯了
// 希望懂得大佬給小弟支個招// try{
// submissionServiceProxy.insert(name, age);
// }catch (NullPointerException e){
// System.out.println("禁止重復提交");
// }}
}
思路就是使用代理來執行方法,使用aop的思想對其進行切片,在執行方法前加一個分布式鎖,這里分布式鎖采用的是redis.nx,并加上一個過期時間防止死鎖。整體只做了一個簡單模擬,寫的比較簡單,有錯誤或不足的地方,還請指正,共同進步。