반응형
모든 Controller
(메소드)의 동작이 끝나고 로그를 처리하기 위해 SPRING
AOP
의 @after
를 사용하여 기록을 하고 있었습니다.
작업 도중 파일 업로드를 위한 multipart
의 타입의 전송의 경우 request
의 값이 null
값으로 처리되어 값을 받아 올 수 없었고 처리한 방법은 아래와 같이 2가지정도가 있었습니다.
-
aop부분에서 형변환을 처리하여 값을 변경하였습니다.
-
Interceptor에서 request의 타입을 체크하여
RequestContextHolder
의 속성값을 변경하였습니다.
after어노테이션에서 형변환 방식
@After("execution(public * egovframework.*.*.*.*(..))")
public void logWrite(JoinPoint joinPoint) throws Throwable {
final String methodName = joinPoint.getSignature().getName();
ServletRequestAttributes attribute = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes());
HttpServletRequest request = attribute.getRequest();
// 멀티 파트 체크 **************
if (request.getContentType() != null && request.getContentType().toLowerCase().contains("multipart/form-data")) {
MultiReadAndCopyHttpServletRequest copyReq = new MultiReadAndCopyHttpServletRequest(request); //Request복사
CommonsMultipartResolver cmResolver = new CommonsMultipartResolver(); //형식변환준비
MultipartHttpServletRequest req = cmResolver.resolveMultipart(copyReq); //변환
request = req;
}
// 멀티 파트 체크 **************
(...) //이후 로그처리
첫번째 해결방식으로 reqeust
의 값이 null
인지 체크후 multipart/form-data
인지 확인 후 일치한다면, request
를 MultipartHttpServletReqeust
로 형변환처리하였습니다.
해당 방법으로 해결은 가능하지만 AOP
의 양이 많아지거나 처리로직이 많아지면 가독성면이나 이후 유지보수 측면에서 좋지 않을것으로 판단하여 다른방법을 찾아보았고 Interceptor
에서 처리하는 방법을 확인하였습니다.
Interceptor 추가하기
두번째 처리방법으로 Interceptor
를 추가하고 instanceof
를 통해 타입을 체크 후 변경해주도록 하였습니다.
MultipartHandlerInterceptor.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* form태그 encType이 "multi/part"로 넘어갈경우 request set변경처리
* @author srok
*
*/
public class MultipartHandlerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request instanceof MultipartHttpServletRequest) {
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
}
return true;
}
}
dispatcher-servlet.xml
Interceptor
정보 추가
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*.do" />
<bean class="프로젝트 경로.MultipartHandlerInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
실 적용은 두번째 방식을 적용하였습니다.
두번째 처리방식 참조 URL
반응형
'WEB > Spring' 카테고리의 다른 글
Spring - 스프링 프로젝트에서 netty사용하기 (7) | 2020.09.22 |
---|---|
Spring - Apache Tika를 활용하여 파일 위변조 체크하기 (2) | 2020.05.19 |
Spring - java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList (0) | 2020.04.23 |
Spring - Filter에서 @PostConstruct 처리시 2번 이상 동작하는 현상 (0) | 2020.04.14 |
Spring - HttpSessionListener 로그인 세션 관리(중복 로그인 방지하기) (6) | 2020.04.13 |