一天一坑系列Springboot中AOP拦截不到指定路径的方法,拦截器失效
Posted 善良勤劳勇敢而又聪明的老杨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天一坑系列Springboot中AOP拦截不到指定路径的方法,拦截器失效相关的知识,希望对你有一定的参考价值。
热门系列:
-
【一天一坑系列】使用Comet4j实现服务器推送实现时的一系列问题
-
【一天一坑系列】Springcloud服务接口请求超时
-
【一天一坑系列】Java中Post请求使用application/x-www-form-urlencoded类型请求,Feign调用时对象类型入参数据丢失问题
-
程序人生,精彩抢先看
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系列)