一天一坑系列Springboot中AOP拦截不到指定路径的方法,拦截器失效

Posted 善良勤劳勇敢而又聪明的老杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天一坑系列Springboot中AOP拦截不到指定路径的方法,拦截器失效相关的知识,希望对你有一定的参考价值。

热门系列:


1.问题描述

公司业务代码中,用户信息Token通过AOP区分处理校验。今天写了一个控制器,里面的方法如下:

package com.xxxxx.web.xxxxx.controller;

import com.xxxxx.cashloan.constants.UrlConstants;
import com.xxxxx.common.model.Result;
import com.xxxxx.sys.bean.xxxxx.NotifyCallBackDTO;
import com.xxxxx.sys.bean.xxxxx.UserAccessInfoDTO;
import com.xxxxx.sys.service.MemberCenterService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * @author xxxxx
 * @email xxxxx
 * @date 2020/4/16 10:52
 * @description
 */
@RestController
@RequestMapping(UrlConstants.xxxxx+ "/memberCenter")
public class xxxxxMemberCenterController 

    @Resource
    private MemberCenterService memberCenterService;

    @PostMapping(value = "/assembleThirdUrl")
    Result assembleThirdUrl(@RequestBody UserAccessInfoDTO userAccessInfoDTO)
        if(Objects.isNull(userAccessInfoDTO.getUserId()) || userAccessInfoDTO.getUserId() == 0)
            return new Result(Result.ERROR_CODE,"userId不能为空");
        
        return memberCenterService.assembleThirdUrl(userAccessInfoDTO);
    


aop的切面中切点配置如下:

@Pointcut("execution(public * com.xxxxx.web.*.controller.*.*(..))")

问题来了:aop的拦截器并没有拦截到此方法,所以也无法做到校验处理!

 

2.问题分析与解决

首先,可以确定拦截器的切面配置是绝对没有问题的,因为相同路径下的其他方法可以被拦截到。所以,开始分析问题应该出在方法所在类本身当中。通过对比其他类代码,最终发现。我所写的方法,没有加Public修饰符,也就是为默认访问权限的。

解决方法:将需要被拦截的类中方法,都加上public修饰符即可!

public Result assembleThirdUrl(@RequestBody UserAccessInfoDTO userAccessInfoDTO)

加上之后,该方法就会被拦截器正常拦截,原来的用户信息校验处理也得以执行。

原因分析:因为被拦截的控制器类xxxxxMemberCenterController 和拦截器切面类不在同一个包路径下。而不加修饰符的方法,属于default修饰符,只能被当前类和同一包名路径下的其他类或子类访问。因此aop在拦截时,因为访问权限问题,是无法拦截到此方法的!

 

 

以上是关于一天一坑系列Springboot中AOP拦截不到指定路径的方法,拦截器失效的主要内容,如果未能解决你的问题,请参考以下文章

一天一坑系列无法访问Controller:SpringBoot项目启动后,请求无法进入控制器Controller中(可以进入服务,但是无法访问控制器)

六SpringBoot整合aop(SpringBoot系列)

SpringBoot —— AOP注解式拦截与方法规则拦截

SpringBoot 三种拦截http请求方式Filter,interceptor和aop

Spring aop 拦截不到Dao

一天一坑系列SpringCloud微服务项目本地可以正常启动,但在Flink中却无法启动,莫名其妙????