自定义注解

2022-08-18 20:40:06 浏览数 (2)

创建@Aptx4869注解类

代码语言:javascript复制
import java.lang.annotation.*;

/**
 * @author xuyuntong
 * @date 2020/9/29 10:13
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Aptx4869 {
}

创建@Aptx4869注解类的切面拦截器

代码语言:javascript复制
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

/**
 * @author xuyuntong
 * @date 2020/9/29 10:16
 */
@Aspect
@Component
public class Aptx4869Aspect {

    @Around(value = "@annotation(aptx4869)")
    public Object check(ProceedingJoinPoint joinPoint, Aptx4869 aptx4869) throws Throwable {
        Object obj = null;
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();

        //当是post方法时,校验参数,否则走下方的设置参数,这意味着在调用这个post方法之前,需要调用另外一个有次注解的接口方法,来设置参数
        if("POST".equalsIgnoreCase(request.getMethod())){
            Object sessionFlag = ShiroKit.getSessionAttr("柯南汉字怎么写");

            //这里request是前台页面的参数,要在form表单里提交带过来的
            String 柯南汉字怎么写 = request.getParameter("柯南汉字怎么写");
            if(sessionFlag == null || !sessionFlag.equals(柯南汉字怎么写)){
                throw new Exception("不知道柯南汉字怎么写,不予通过");
            }
            obj = joinPoint.proceed();
        } else {
            obj = joinPoint.proceed();
        }

        return obj;
    }

    /**
     * 当不是post方法时,就只设置参数,只有当是post方法时,才去校验
     * @param joinPoint
     */
    @AfterReturning(value = "@annotation(nnotion.Aptx4869)")
    public void settingParameters(JoinPoint joinPoint){
        System.out.println("当前处理类为:"  joinPoint.getTarget().getClass().getName());
        String uuid = UUID.randomUUID().toString().replace("-", "");
        ShiroKit.setSessionAttr("柯南汉字怎么写","柯南" uuid);
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();

        //这里是为了在form表单中存入到hidden的input中去,这样就会在提交表单的时候,将这个参数再带过来了,但前提是前台要将这个值存储在form表单中
        request.setAttribute("柯南汉字怎么写","柯南" uuid);

    }


}
实现逻辑

代码逻辑: 访问get接口,接口通过并返回一个参数key-value设置到request中去, 同时也会往session中设置一个相同的key-value, 前台拿到这个key-value,然后存储到form表单中,post提交表单时,会将这个key-value提交, 后台校验此key-value和session中的key-value是否一致

使用方法

在Controller的方法上添加就行

代码语言:javascript复制
/**
 * 修改资源
 * @return 返回处理结果
*/
@RequestMapping(value = "/edit")
@ResponseBody 
@Aptx4869
public Object edit() {}

0 人点赞