springboot- uso de AOP para interceptar dado cuenta de registro

Un prólogo

Con la funcionalidad AOP de la primavera, podemos aplicar AOP a un gestor de excepciones global, la solicitud de interceptación mundial, la función principal de este artículo es utilizar AOP registro de aplicación, tales como los que realizan operaciones de usuario para un proyecto exitoso es necesario la grabación, por lo que se da aquí por el conocimiento se aplica un modelo simple de búsqueda;

Dos definiciones enumeración

Enumeración define el tipo de operación es darse cuenta de lo que el registro, como se muestra a continuación, algunos registros de aterrizaje, algunos registros CRUD, diferentes sistemas pueden definir diferentes de registro, los lectores son libres de elegir;

public enum LogEnum {

    UNOPERATE(0,"未定义操作"),
    SELECT(1,"查询"),
    INSERT(2,"添加"),
    UPDATE(3,"更新"),
    DELETE(4,"删除"),
    EXPORT(5,"excel导出"),
    LOGIN(6,"登陆"),
    LOGOUT(7,"登出"),
    ;

    LogEnum( Integer code, String operate) {
        this.operate = operate;
        this.code = code;
    }

    LogEnum(){

    }

    // 操作
    private String operate;
    // 操作码
    private Integer code;

    public String getOperate() {
        return operate;
    }

    public void setOperate(String operate) {
        this.operate = operate;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}

tres notas

Uso anotaciones propósito es utilizar un método en el que la anotación, es decir, que pertenecen a qué operación se marca, se puede implementar simplemente en las operaciones realizadas por un método en el que tipo de anotación de unión enumeración operación ya definido;

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorLog {

    /* *
     * @Author lsc
     * <p>日志内容 </p>
     * @Param []
     * @Return java.lang.String
     */
    String value() default "";

    /* *
     * @Author lsc
     * <p>日志操作类型 </p>
     * @Param []
     * @Return int
     */
    LogEnum operateType() default LogEnum.UNOPERATE;


}

la cuarta sección AOP

Las notas fijan como el punto de corte. El corte punto de corte después de tejer alrededor de asesoramiento anotada método de mejora ha sido etiquetado, esta vez para obtener todas las anotaciones operaciones, almacenamiento y registrar los registros, el registro puede lograrse simplemente supervisar la operación del usuario, la corriente se pone en AOP obtener un nombre de usuario, un método común de marco shiro getSubject haber obtenido nombre de usuario, por supuesto, ser obtenido de acuerdo con diferentes lectores usando diferentes técnicas, buscadores de conocimiento aquí a fin de lograr una función simple no pueden utilizar un montón de métodos engorrosos para lograr una sistema de autenticación de acceso de usuario;

/**
 * @Author lsc
 * <p>日志aop切面 </p>
 */

@Aspect
@Component
public class LogAsp {

    /* *
     * @Author lsc
     * <p> 设置切点</p>
     * @Param []
     * @Return void
     */
    @Pointcut("@annotation(com.zszxz.annotation.MonitorLog)")
    public void logPointCut() {

    }

    // 环绕通知
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // 开始时间
        LocalDateTime beginTime = LocalDateTime.now();
        // 执行方法
        Object result = point.proceed();
        // 结束时间
        LocalDateTime endTime = LocalDateTime.now();
        Duration duration = Duration.between(beginTime, endTime);
        // 操作时长
        long seconds = duration.getSeconds();
        // 保存日志
        saveLog(point,seconds);
        return result;
    }

    private void  saveLog(ProceedingJoinPoint point, long seconds){
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        // 获得注解
        MonitorLog monitorLog = method.getAnnotation(MonitorLog.class);
        if (monitorLog!=null){
            // 获得操作类型
            LogEnum operateType = monitorLog.operateType();
            // 获得操作内容
            String value = monitorLog.value();
            System.out.printf("获得操作类型: %s , 获得操作内容: %s ",operateType.getCode(),value);

            //请求的参数
            Object[] args = point.getArgs();
            try{
                List<Object> objects = Arrays.asList(args);
                System.out.println(objects);
            }catch (Exception e){

            }

        }
    }
}

Cinco capa de presentación

controlador, el método de simulación para consultar una operación de usuario, y el método indicado en esta anotación es consulta un usuario, cuando se accede a la AOP será bloqueada esta API;

/**
 * @Author lsc
 * <p> </p>
 */
@RestController
public class UserController {


    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @MonitorLog(value="查询用户",operateType = LogEnum.SELECT)
    @GetMapping("zszxz")
    public String getUser(String user){
        return "zszxz";
    }


}

Si usted no sabe lo que se puede hacer referencia a la fuente de buscadores de conocimiento (Recuadro explicación o tener buscadores de conocimiento princesa dirección de github),

Supongo que te gusta

Origin www.cnblogs.com/zszxz/p/12448086.html
Recomendado
Clasificación