通过自定义注解去实现针对不同的请求和参数做一些共有方法的校验

背景:此时我们有一个需求,在进门之前我们需要检查这个人有没有进门的资格如果没有就不让他去执行我们进门之后的逻辑了,那么我们可以通过自定义注解去解决这个方案,避免了代码的冗余。 但是我们需要进不同的门 导致我们的请求方式不同 参数名称也不同。

解决方案:

1.自定义一个注解

//在方法上使用
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)

public @interface ValidateXXXXX {

    String fileNames() default "";
}

 2.编写一个切面类去实现这个接口

Aspect
@Component
public class ValidateXXXXXAspect {
    @Around("@annotation(validateXXXX)")
    public Object around(ProceedingJoinPoint joinPoint, ValidateActivity validateActivity) throws Throwable {

        // 获取 HttpServletRequest,访问请求数据
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        // 获取注解中指定的字段名
        String fileName = validateActivity.fileNames();

        // 从请求中动态获取ID
        String activityId = getActivityIdFromRequest(request, fileName);

        if (XXXXId != null && check(XXXXId)) {
            return joinPoint.proceed();

        } else {

            throw new RuntimeException("不可访问");
        }

    }


    // 业务逻辑
    public boolean check(String XXXXId) {
        if ("6".equals(XXXXId)) {
            return true;
        }
        return false;

    }

    //
    private String getActivityIdFromRequest(HttpServletRequest request, String fileName) {
        // 先尝试在 URL 中查找参数
        String parameter = request.getParameter(fileName);
        if (!ObjectUtils.isEmpty(parameter)) {
            return parameter;
        }

        // 如果在 URL 中没有找到,再尝试从请求体中查找
        try {
            // 获取缓存的请求体内容
            String requestBody = ((CachedBodyHttpServletRequestWrapper) request).getRequestBody();
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(requestBody);
            JsonNode jsonNode1 = jsonNode.get(fileName);
            if (jsonNode1 != null) {
                return jsonNode1.asText();
            }
        } catch (IOException e) {
            throw new RuntimeException("Error reading request body", e);
        }
        return null;
    }

********** 重点***************** 

 因为请求体中的请求只能被调用一次:

转载:解决SpringMVC中RequestBody只能读取一次的方法_request body只能读取一次-CSDN博客

​​​​​​

解决方案:就是去缓存请求体内容

在SpringBoot中缓存HTTP请求响应体(实现请求响应日志的记录)_springboot contentcachingrequestwrapper-CSDN博客

Controller

    @PostMapping("/getList")
    @ValidateActivity(fileNames = "actId")
    public Result getList(@RequestBody ActivityDto activityDto) {


        return Result.success(userService.getUser("5"));
    }

    @GetMapping("/getList1")
    @ValidateActivity(fileNames = "actId2")
    public Result getList1(String actId2) {

   
        return Result.success(userService.getUser("5"));
    }

你可能感兴趣的:(java,开发语言)