Spring Advanced (приложение AOP) — проблема недопустимого доступа к частному методу уровня контроллера после динамического проксирования AOP.

Вставьте сюда описание изображения

Предисловие

Динамический прокси и АОП (аспектно-ориентированное программирование) — ключевой и сложный момент весны, их нужно глубоко понять и научиться гибко применять в проектах.

В этом блоге рассматривается проблема сбоя доступа к частному методу, возникающая в практических приложениях динамического прокси-АОП.

Список других статей АОП, связанных с методами улучшения, выглядит следующим образом:

Основы Spring (основной контейнер) — от файлов конфигурации до разработки аннотаций и создания объектов + назначение переменных-членов IOC и расширенный метод AOP

Вставьте сюда описание изображения
Spring Advanced (понимание АОП) — статический/динамический прокси и аспектно-ориентированное программирование AOP (аспектно-ориентированное программирование), методы ведения журнала и улучшения

Вставьте сюда описание изображения

выводить


Обнаружение и решение проблемы недопустимого доступа к частному методу на уровне контроллера после динамического прокси-АОП.

1. Используйте метод улучшения AOP для улучшения уровня контроллера.

Вставьте сюда описание изображения

package com.tianju.fresh.aop;

import com.woniu.fresh.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;

/**
 * 进行日志的记录
 */
@Component
@Aspect
@Slf4j // 用lombok.extern.slf4j.Slf4j;
public class LoggingAsp {
    
    

    // 给所有标注了@Controller注解的方法做增强
    @Before("@within(org.springframework.web.bind.annotation.RestController)")

    public void log(JoinPoint joinPoint){
    
    
        String className = joinPoint.getTarget().getClass().getSimpleName(); // 获取类名
        String methodName = joinPoint.getSignature().getName(); // 获取方法名
        Object[] args = joinPoint.getArgs(); // 获取传的参数

        // 获取一下httpRequest
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        String username;
        try {
    
    
            // 获得用户名
            String jwt = request.getHeader("jwt");
            Map userInfo = JwtUtil.getUserInfo(jwt);
            log.debug("登陆的用户的信息:"+userInfo);
            username = userInfo.get("username")+"-"+userInfo.get("realName");
        } catch (Exception e) {
    
    
            username = "神秘的用户";
        }

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date date = new Date();
        String formattedDate = sdf.format(date);

        // ip地址
        String ipAddress = request.getRemoteAddr();
        log.info(">>>> LOG {} 从ip地址 {} {}访问了 {} 类的 {} 方法,传的参数为 {} ",
                formattedDate, ipAddress, username,className,methodName, Arrays.toString(args));
    }
}

2. При вызове API контроллера было обнаружено, что внедрение зависимости было нулевым.

После включения расширенного метода AOP в сообщении об ошибке отображается исключение нулевого указателя, что довольно странно, поскольку @autowired не пользуется популярностью, указывая на то, что этот класс существует в контейнере IOC, но на самом деле он считается нулевым.

Вставьте сюда описание изображения

3. Запустите просмотр в режиме отладки.

Используйте режим отладки для просмотра и доступа к интерфейсу API. Обнаружено, что два введенных зависимостями класса сущностей имеют значение NULL, поэтому сообщается об ошибке, исключении нулевого указателя.

Вставьте сюда описание изображения

4. Причина: метод уровня контроллера является частным.

После проверки выяснилось, что метод в слое контроллера является приватным.В этом и оказалась такая проблема.

Вставьте сюда описание изображения

5. Решение: сделать общедоступным

Измените его на общедоступный, и эти два значения больше не будут нулевыми.

Вставьте сюда описание изображения

Подведем итог

Обнаружение и решение проблемы недопустимого доступа к частному методу на уровне контроллера после динамического прокси-АОП.

Вставьте сюда описание изображения

Guess you like

Origin blog.csdn.net/Pireley/article/details/133341988