Spring Boot
버전을 2.4.4
에서 2.7.7
로 버전업을 하였더니, URL에서 슬래시가 두개가 들어가면 Mapping을 못 찾는 현상이 발생했다.
서칭해보니, Apache 웹서버에서 아래 설정을 넣어주면 슬래시 두개를 하나로 변경해준다고 한다.
근데 나는 ProxyPass를 사용하고 있어서 그런지, 이 방법은 먹히지 않았다.
AllowEncodedSlashes ON
Request 요청을 인터럽트하여 URL을 바꿔주었더니 Mapping이 정상적으로 작동한다!
슬래시가 들어간 uri를 슬래시 하나로 교체하는 알고리즘을 작성한다.
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
public class DoubleSlashFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String requestURI = ((HttpServletRequest) request).getRequestURI();
String sanitizedURI = requestURI.replaceAll("//+", "/").replaceAll(request.getServletContext().getContextPath(), "");
request.getRequestDispatcher(sanitizedURI).forward(request, response);
}
@Override
public void destroy() {
}
}
이 때, 조금 헤맨 부분이 Context Path
옵션이 들어가있을 경우 Path가 계속 누적된다.
그 이유는 uri는 정상적으로 보이지만, RequestDispatcher로 포워딩을 하기 때문에 계속 쌓인다.
request.getRequestDispatcher(sanitizedURI).forward(request, response);
Configuration
을 통해 필터를 등록한다.
import com.enicom.bigdata.filter.DoubleSlashFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean<DoubleSlashFilter> doubleSlashFilter() {
FilterRegistrationBean<DoubleSlashFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new DoubleSlashFilter());
registrationBean.addUrlPatterns("/*"); // 적용할 URL 패턴 설정
return registrationBean;
}
}
그 뒤에 재 배포후 정상 작동하는 것을 확인했다!