Spring boot Interceptor Ajax 체크 (Redirect 이슈)

2023. 4. 5. 16:37·Java/Spring Boot

2023.03.30 - [Etc] - 타 도메인에 쿠키 생성하기

 

타 도메인에 쿠키 생성하기

✅ 문제 직면 현재 개발하는 서비스에서 다른 사이트의 로그인 정보를 받아야 하는 상황 속에서 SSO (Single-Sign-On)를 활용하지 않아본인이 직접 API를 통해 사용자 정보를 입력 받고 Session을 생성해

magicmk.tistory.com

이전 포스팅에서 Interceptor를 통해 Session을 체크하는 로직을 구현했었는데

Session을 체크하는 것 자체는 문제가 없었지만 다른 부분에서 약간의 문제가 발생하였는데

 

Ajax를 통해 접근 시 Redirect가 안된다는 것이었다.

 

그래서 Interceptor에서 Ajax 요청인지를 체크하고 로직을 다르게 구현하였다.


🟧 Interceptor & Ajax

⏹️ SessionInterceptor.java

public class SessionCheckInterceptor implements HandlerInterceptor {

    private static final String AJAX_HEADER_NAME = "X-Requested-With";
    private static final String AJAX_HEADER_VALUE = "XMLHttpRequest";
    private static final String REDIRECT_URL = "/permissionDenied"; // 세션 만료시 리다이렉트 할 URL

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            if (isAjaxRequest(request)) {
                // Ajax 요청일 경우, "SESSION_EXPIRED" 라는 값을 Response Header에 추가한다.
                response.setHeader("SESSION_EXPIRED", "true");
                return false;
            } else {
                // 일반 요청일 경우, 세션이 만료되었다는 페이지로 리다이렉트한다.
                response.sendRedirect(request.getContextPath() + REDIRECT_URL);
                return false;
            }
        }
        return true;
    }

    // Ajax 요청인지 체크하는 메소드
    private boolean isAjaxRequest(HttpServletRequest request) {
        return AJAX_HEADER_VALUE.equals(request.getHeader(AJAX_HEADER_NAME));
    }
}

위와 같이 Interceptor에서 들어오는 요청이 Ajax를 통한 요청인지를 확인한다.

 

⏹️ client.js

$.ajax({
    type: "POST",
    url: "/myPage",
    data: {},
    dataType: "json",
    success: function (data, textStatus, jqXHR) {
        // Ajax 요청이 성공한 경우, 처리할 코드 작성
        if (jqXHR.getResponseHeader("SESSION_EXPIRED") === "true") {
            alert("세션이 만료되었습니다.");
            window.location.href = "/permissionDenied";
        }
    },
    error: function (jqXHR, textStatus, errorThrown) {
    }
});

예상대로라면 Session이 존재하지 않을 경우 error를 통해 로직이 흘러갈 것 같은데

예상과는 다르게 Session이 존재하지 않아도 success로 떨어진다.

 

명확한 이유는 모르겠으나 Interceptor에서 데이터를 전달받았기 때문에 Ajax에서는 요청이 성공했다고 판단하는 것 같다. 혹시 이유를 알고 계신 분이 있다면 답글 부탁드립니다.


위와 같이 처리하면 Session이 만료가 된 뒤에 새로고침이나 URL로 이동할 때뿐만 아니라 Ajax를 통한 요청에서도 내가 원하는 특정 페이지로 리다이렉트 처리를 할 수 있다.

저작자표시 비영리 (새창열림)

'Java > Spring Boot' 카테고리의 다른 글

Thymeleaf 스프링 통합과 폼  (0) 2024.02.15
Ajax를 통해 파일과 Json 업로드 후 Controller로 받기  (0) 2023.05.12
Spring boot RestAPI 파일 다운로드  (0) 2023.02.10
Spring boot Controller Zip 압축 해제  (0) 2023.01.25
Spring boot H2 DB 설정  (0) 2022.11.10
'Java/Spring Boot' 카테고리의 다른 글
  • Thymeleaf 스프링 통합과 폼
  • Ajax를 통해 파일과 Json 업로드 후 Controller로 받기
  • Spring boot RestAPI 파일 다운로드
  • Spring boot Controller Zip 압축 해제
요술공주밍키
요술공주밍키
조금씩이라도 꾸준히..
  • 요술공주밍키
    삽질의흔적
    요술공주밍키
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • Java (42)
        • Spring Boot (14)
        • Spring Boot 게시판 (14)
        • 공중화장실 찾기 (4)
        • 쇼핑몰 (8)
      • JavaScript (8)
        • NodeJS (2)
      • Python (5)
        • Django (4)
      • Server (10)
        • Docker (4)
        • K8S (0)
        • Jenkins (1)
      • 알고리즘 (24)
        • 프로그래머스 (19)
        • 백준 (5)
      • Etc (21)
        • 개발 팁 (1)
      • 일상 (27)
        • 독서 포스트 (25)
        • 회고록 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
요술공주밍키
Spring boot Interceptor Ajax 체크 (Redirect 이슈)
상단으로

티스토리툴바