728x90
2023.03.30 - [Etc] - 타 도메인에 쿠키 생성하기
이전 포스팅에서 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 |