Notice
Recent Posts
Recent Comments
Link
반응형
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- PostgreSQL
- spring security
- webflux
- 보안
- 컨퍼런스
- NGINX
- 로그인
- ktlin
- postgis
- deepseek vs chatgpt
- Spring Boot
- docker
- 코틀린
- Kotlin
- AWS
- Mono
- 인증
- Flux
- API
- exception
- Spring
- 본인인증
- 본인확인
- 딥시크
- AOP
- db
- 허깅 페이스
- netty
- 공동인증서
- IntelliJ
Archives
- Today
- Total
[수미수의 개발 브로구]
[Spring] Spring AOP에서 요청 파라미터 가져오기 본문
반응형
AOP 로 요청 된 요청 파라미터 검색 하기
요청 파리미터로 검색 하기
AOP 를 통해서 요청 된 파라미터의 이름의 객체를 가져온다. MethodSignature의 parameterNames 메서드를 통해서, 원하는 파라미터의 이름을 indexOf 를 통해서 검색하면 요청된 파라미터의 인덱스 정보를 가져올 수 있다. 그 후 jp.args 에 인덱스 정보를 통해서 접급 하면 이름 기반으로 요청 파라미터를 가져 올 수 있다. 아래는 예제 샘플은 메서드에 ServiceLogging이라는 어노테이션이 적용 되었을 때 가동 되는 샘플 이다.
@Aspect
@Component
class AnnotationBasedLoggerAspect() {
companion object {
private val logger = LoggerFactory.getLogger(this::class.java)
}
@Before("@annotation(.......ServiceLogging)")
fun beforeAop(jp: JoinPoint){
val httpServletRequest: HttpServletRequest = (RequestContextHolder.getRequestAttributes() as ServletRequestAttributes).request
logProcess(jp, httpServletRequest)
}
private fun process(jp: JoinPoint, httpServletRequest: HttpServletRequest) {
val args = jp.args
val methodSignature = jp.signature as MethodSignature
try{
val parameterName = methodSignature.parameterNames
val idx = parameterName.indexOf("logParameter")
if (idx >= 0) {
val tmp = args[idx]
if (tmp is LogRequest) {
logger.info("Found")
}
}
} catch (e : Exception){
e.printStackTrace()
}
}
}
클래스 타입으로 검색하기
만약, 요청된 파리미터의 클래스 타입으로 파라미터의 객체를 가져오고 싶으면, 아래 소스와 같이 jp.args 에 filter operator 를 활용하여 가져 올 수 있다. 아래는 메서드에 ServiceLogging이라는 어노테이션이 적용 되었을 때 가동 되는 샘플 이며, 요청 된 파라미터의 클래스 타입이 ParameterClass 인 파라미터 객체를 가져온다.
@Aspect
@Component
class AnnotationBasedLoggerAspect() {
companion object {
private val logger = LoggerFactory.getLogger(this::class.java)
}
@Before("@annotation(.......ServiceLogging)")
fun beforeAop(jp: JoinPoint){
val httpServletRequest: HttpServletRequest = (RequestContextHolder.getRequestAttributes() as ServletRequestAttributes).request
logProcess(jp, httpServletRequest)
}
private fun process(jp: JoinPoint, httpServletRequest: HttpServletRequest) {
val args = jp.args
val methodSignature = jp.signature as MethodSignature
try{
val parameterClazz = jp.args.filter { it.javaClass == ParameterClass::class.java }.firstOrNull()
parameterClazz.doSomething();
} catch (e : Exception){
e.printStackTrace()
}
}
}반응형