4 changed files with 117 additions and 1 deletions
-
25src/main/java/com/gaotao/common/annotation/RepeatSubmit.java
-
76src/main/java/com/gaotao/common/aop/RepeatSubmitAspect.java
-
3src/main/java/com/gaotao/modules/schedule/controller/ScheduleController.java
-
14src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java
@ -0,0 +1,25 @@ |
|||||
|
package com.gaotao.common.annotation; |
||||
|
|
||||
|
import java.lang.annotation.Documented; |
||||
|
import java.lang.annotation.ElementType; |
||||
|
import java.lang.annotation.Inherited; |
||||
|
import java.lang.annotation.Retention; |
||||
|
import java.lang.annotation.RetentionPolicy; |
||||
|
import java.lang.annotation.Target; |
||||
|
|
||||
|
/** |
||||
|
* @ClassName: RepeatSubmit |
||||
|
* @Description: 自定义重复提交的注解 |
||||
|
* @author LR |
||||
|
* @date 2020年4月16日 |
||||
|
* @version V1.0 |
||||
|
*/ |
||||
|
@Target(value = {ElementType.METHOD}) |
||||
|
@Retention(value = RetentionPolicy.RUNTIME) |
||||
|
@Inherited |
||||
|
@Documented |
||||
|
public @interface RepeatSubmit { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
@ -0,0 +1,76 @@ |
|||||
|
package com.gaotao.common.aop; |
||||
|
|
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
|
||||
|
import javax.servlet.http.HttpServletRequest; |
||||
|
import javax.servlet.http.HttpServletResponse; |
||||
|
|
||||
|
import com.gaotao.modules.sys.entity.SysUserEntity; |
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
import org.apache.shiro.SecurityUtils; |
||||
|
import org.aspectj.lang.ProceedingJoinPoint; |
||||
|
import org.aspectj.lang.annotation.Around; |
||||
|
import org.aspectj.lang.annotation.Aspect; |
||||
|
import org.aspectj.lang.annotation.Pointcut; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.web.context.request.RequestContextHolder; |
||||
|
import org.springframework.web.context.request.ServletRequestAttributes; |
||||
|
|
||||
|
import com.google.common.cache.Cache; |
||||
|
import com.google.common.cache.CacheBuilder; |
||||
|
|
||||
|
/** |
||||
|
* @ClassName: RepeatSubmitAspect |
||||
|
* @Description: 自定义注释切点 |
||||
|
* @author LR |
||||
|
* @date 2020年4月17日 |
||||
|
* @version V1.0 |
||||
|
*/ |
||||
|
@Component |
||||
|
@Aspect |
||||
|
public class RepeatSubmitAspect { |
||||
|
|
||||
|
//缓存数据存放 |
||||
|
private static final Cache<String, Object> caches = CacheBuilder.newBuilder() |
||||
|
.maximumSize(10000).expireAfterWrite(5, TimeUnit.SECONDS).build(); |
||||
|
|
||||
|
//切点 |
||||
|
@Pointcut("@annotation(com.gaotao.common.annotation.RepeatSubmit)") |
||||
|
public void pointCut() {} |
||||
|
|
||||
|
//处理业务逻辑 |
||||
|
@Around("pointCut()") |
||||
|
public Object submitAop(ProceedingJoinPoint pjp) throws Exception { |
||||
|
//获取request |
||||
|
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
||||
|
HttpServletRequest request = attributes.getRequest(); |
||||
|
String url = request.getRequestURI(); |
||||
|
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); |
||||
|
//判断是否是否null |
||||
|
if(null == currentUser) { |
||||
|
HttpServletResponse response = attributes.getResponse(); |
||||
|
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Session is expired!"); |
||||
|
return response; |
||||
|
} |
||||
|
String username = currentUser.getUsername(); |
||||
|
//根据用户id+url作为唯一识别的请求 |
||||
|
String key = username + "-" + url; |
||||
|
//空值校验 |
||||
|
if(!StringUtils.isEmpty(key)) { |
||||
|
//判断是否患有当前的key |
||||
|
if(caches.getIfPresent(key) == null) { |
||||
|
caches.put(key, key); |
||||
|
}else { |
||||
|
HttpServletResponse response = attributes.getResponse(); |
||||
|
response.sendError(500, "重复提交!"); |
||||
|
return response; |
||||
|
} |
||||
|
} |
||||
|
//通过检验继续操作 |
||||
|
try { |
||||
|
return pjp.proceed(); |
||||
|
} catch (Throwable e) { |
||||
|
throw new RuntimeException(e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue