[Spring] 이슈 트래킹 (1) - URL 슬래시(//) 두개 문제

김희정·2023년 9월 22일
0

Spring

목록 보기
6/18

문제발생

Spring Boot 버전을 2.4.4 에서 2.7.7로 버전업을 하였더니, URL에서 슬래시가 두개가 들어가면 Mapping을 못 찾는 현상이 발생했다.

로그

  • 기존 로그
    기존 로그
  • 신규 배포 후 로그
    배포 후 로그


해결

시도 1. Apache Conf 파일 변경 (실패)

서칭해보니, Apache 웹서버에서 아래 설정을 넣어주면 슬래시 두개를 하나로 변경해준다고 한다.
근데 나는 ProxyPass를 사용하고 있어서 그런지, 이 방법은 먹히지 않았다.

AllowEncodedSlashes ON

시도 2. Filter 추가 (성공)

Request 요청을 인터럽트하여 URL을 바꿔주었더니 Mapping이 정상적으로 작동한다!

2.1 Filter 클래스 생성

슬래시가 들어간 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);

2.2 Filter 등록

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;
    }
}

그 뒤에 재 배포후 정상 작동하는 것을 확인했다!


Reference

profile
Java, Spring 기반 풀스택 개발자의 개발 블로그입니다.

0개의 댓글