springboot aop 每次请求都有相同代码 可以提出来变aop吗

没次都要从session 取id ,怎么把这个重复存在提出来变成aop
图片说明

这么看来是可以的,针对此类的 Controller 调用方法之前执行这些类似的代码片段。

我能想到的思路是,首先使用自定义注解,在自定义注解里面保存service的名称和调用方法的名称,然后在注解切面实现类里面传进去service的名称和方法名称,然后使用反射原理执行相应的方法

@Target(ElementType.METHOD) //表示该注解使用在方法上
@Retention(RetentionPolicy.RUNTIME) //注解在什么时候进行
@Documented  //生成文档
public @interface SysLog {

    String serviceName() default "";

    String methodName() default "";

}

我觉得使用filter或interceptor可以实现, 你这个看起来就是这个controller下的所有的请求都是如果userId为null,那么就直接返回了,不进行后续的处理,在interceptor中判断如果是请求这个controller的,那么进行判断,如果为null,则直接统一返回。
这篇文章可以参考一下:https://www.jianshu.com/p/fe7428e2e5b0
只需要在preHandle()方法中进行处理即可

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       // 可以从request中获取到session
      Integer userId =  userService.selUserId(session);
            if(userId == null) {
                // 如果需要返回json数据到页面,通过response可以处理
                 response.writer("错误信息")
                return false;
            }
        return true;
    }

可以的
使用spring的aop注解
定义pointcut包路径
spring会自动生成代理类

大概的逻辑,获取session的地方,我只是提供一种思路,具体看你调试怎么能取到。

定义注解

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

aop逻辑:

@Aspect
@Component
public class SelUserAop {

    @Autowired
    private UserService userService;

    @Pointcut("@annotation(com.gourd.common.annotation.SelUser)")
    public void serviceSelUser() {
    }

    @Around("serviceSelUser()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        request.getParameter("session");
        Integer userId =  userService.selUserId(session);
        if(userId !=null){
            return pjp.proceed();
        }else {
            return ResponseFactory.createFailResponse(ResponseStatus.USER_LOGIN_OVERDUE);
        }
    }

}

没必要就那几行代码,以后要改的话,还要从aop里面拿出来