728x90
웹 애플리케이션을 개발할 때, 사용자가 어떤 페이지에서 이동했는지 추적하고 특정 경로로 이동했을 때 제어하는 기능이 필요할 때가 있습니다. 예를 들어, 다음과 같은 요구사항이 있다고 가정해 보겠습니다.
- 사용자가 A 페이지 → B 페이지 로 이동한 경우 정상적으로 B 페이지를 표시한다.
- 사용자가 A → B → C → B(뒤로 가기) 로 이동하면 오류 페이지로 보내고 싶다.
이러한 동작을 구현하기 위해 Spring의 Interceptor 를 활용할 수 있습니다. Interceptor를 사용하면 사용자의 이전 페이지 정보를 세션에 저장하고, 특정 페이지에서 접근을 제어 할 수 있습니다.
🚀 Spring Interceptor를 이용한 해결 방법
1️⃣ Interceptor를 활용한 이전 페이지 저장 및 확인
Spring의 HandlerInterceptor 를 사용하면 사용자의 요청이 컨트롤러로 전달되기 전에 특정 로직을 수행할 수 있습니다. 이를 활용해 사용자의 이전 페이지 URL을 세션에 저장 하고, 특정 페이지에서 접근을 제어할 수 있습니다.
2️⃣ 요청 흐름 및 동작 방식
- 사용자가 A → B 로 이동하면 세션에 이전 페이지 정보(previousUrl)를 저장합니다.
- 사용자가 B → C 로 이동하면 다시 previousUrl 을 업데이트합니다.
- 사용자가 C에서 뒤로 가기(Back)하여 C → B 로 이동하면, 이전 URL이 C 였으므로 오류 페이지(/error)로 리다이렉트합니다.
- 만약 사용자가 A → B → 뒤로 가기 했다면 정상적으로 B 페이지를 유지합니다.
🛠️ Spring Interceptor 구현하기
📌 1. Interceptor 클래스 생성
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class PageNavigationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
String currentUrl = request.getRequestURI(); // 현재 요청된 URL
String previousUrl = (String) session.getAttribute("previousUrl"); // 세션에서 이전 URL 가져오기
System.out.println("현재 페이지: " + currentUrl);
System.out.println("이전 페이지: " + previousUrl);
// B 페이지로 이동한 경우 이전 페이지를 체크
if (currentUrl.equals("/b")) {
if ("/c".equals(previousUrl)) {
// C 페이지에서 B로 이동한 경우 오류 페이지로 리다이렉트
response.sendRedirect("/error");
return false; // 요청을 처리하지 않음
}
}
// 현재 URL을 세션에 저장
session.setAttribute("previousUrl", currentUrl);
return true; // 정상적인 요청 처리
}
}
📌 2. Interceptor를 Spring 설정에 등록
위에서 만든 PageNavigationInterceptor 를 Spring의 WebMvcConfigurer 에 등록해야 합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private PageNavigationInterceptor pageNavigationInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(pageNavigationInterceptor)
.addPathPatterns("/b"); // B 페이지에 대해서만 Interceptor 실행
}
}
📌 3. 컨트롤러 및 오류 페이지 설정
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PageController {
@GetMapping("/a")
public String pageA() {
return "a"; // a.html 페이지 반환
}
@GetMapping("/b")
public String pageB() {
return "b"; // b.html 페이지 반환
}
@GetMapping("/c")
public String pageC() {
return "c"; // c.html 페이지 반환
}
@GetMapping("/error")
public String errorPage() {
return "error"; // error.html 페이지 반환
}
}
✅ 테스트 시나리오
시나리오 | 결과 |
A → B 이동 | B 정상 표시 |
A → B → C → 뒤로가기 (C → B) | 오류 페이지(/error)로 이동 |
A → B → 뒤로가기 | B 정상 표시 |
📌 추가 고려할 사항
🔹 1. 브라우저 캐시 문제 해결
뒤로 가기를 눌렀을 때 브라우저 캐시로 인해 이전 URL이 변경되지 않는 경우, 응답 헤더에 no-cache 설정을 추가할 수 있습니다.
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
🔹 2. Interceptor vs Filter
- Interceptor 는 특정 URL 패턴에 대해서만 동작하게 할 수 있으므로, 페이지 이동을 제어할 때 적합합니다.
- Filter 를 사용하면 모든 요청에 대해 검사할 수 있지만, 특정 페이지(/b)에서만 동작하도록 하려면 추가 설정이 필요합니다.
🎯 결론
Spring Interceptor를 사용하면 사용자의 이전 페이지 정보를 추적하고, 특정 경로에서 접근을 제어 할 수 있습니다. 위 코드대로 적용하면 사용자가 A → B → C → 뒤로 가기 를 했을 때, C에서 B로 넘어온 경우 오류 페이지로 리다이렉트할 수 있습니다.
LIST
'Develop > JAVA' 카테고리의 다른 글
[Java] 봉인 클래스(Sealed Classes): Java 17의 혁신적인 기능과 예제까지 (0) | 2025.03.19 |
---|---|
[Java] 엑셀파일 읽어서 값 수정 후 다시 엑셀 다운로드 (0) | 2025.02.21 |
[Java] 특정 달의 마지막 날짜와 요일 구하기 (2) | 2025.02.19 |
Spring Framework의 @Scheduled 어노테이션 완벽 가이드 (1) | 2025.02.14 |
[Java] REST API 호출 및 JSON 데이터를 DTO로 파싱하는 방법 (3) | 2025.01.08 |