[SpringBoot,Thymeleaf] 페이지의 일부만 업데이트할 때 세션 시간 초과 지원

SpringBoot + Thymeleaf에서 Ajax 처리하여 HTML을 부분적으로 다시 작성하는 경우가 있습니다.
검색 처리를 Ajax로 해 검색 결과의 곳만 동적으로 재기록하는, 같은 느낌이군요.
따로 SpringBoot+Thymeleaf가 아니고 있다고 합니다만.
SpringBoot라고 말하고 있습니다만 요점은 SpringMvc군요.

이 조합으로 할 때 컨트롤러의 반환 값

Return "hogehoge:fugafuga"

와 같이 th:fragment를 지정한 부분의 HTML만을 돌려주도록 합니다.


이런 느낌이군요.
「검색」, 「클리어」의 뒤, 「이전」의 앞까지의 부분이 fragment가 되어 있습니다.

하지만 이렇게하면 세션 시간이 초과되면 비극이 발생합니다.

구체적으로는


이렇게 됩니다.
fragment 부분에 로그인 화면이 끼어 버렸습니다.

SpringSecurity의 인증 필터를 사용하면 타임 아웃하고 있는 경우는 자동적으로 로그인 화면에 날려 줍니다만, ajax로 fragment 부분만 되돌리고 있는 경우도 예외는 아니다.

그런데, 이것으로는 매우 보기 좋지 않기 때문에 어떻게든 하고 싶은 곳입니다.
그러나 서버 측에서는 SpringSecurity가 확실히 집어 주고 있기 때문에 개입의 시도가 없고, 클라이언트 측에서는 정상(상태 코드=200)으로 로그인 화면이 돌아옵니다.
그런데 무슨 일인가.

돌아온 것이 로그인 화면이라면 리디렉션하면 좋지 않다.

라는 이유로 로그인 화면에 코멘트로 장소표시를 묻고・・・

로그인 화면 시작
<!DOCTYPE html> <!-- this is login form -->
<html xmlns:th="http://www.thymeleaf.org">

그것을 발견하면 리디렉션!

js-Ajax 공통 처리
// タイムアウトしてから検索すると、検索エリアにログイン画面が埋め込まれる事象の対応
$(document).ajaxSuccess(function(e, xhr, options){
    // レスポンスにDOCTYPEが含まれたらログイン画面と判断する
    if(xhr.responseText.match(/<!-- this is login form -->/)){
        // ログイン画面を受信した場合は自画面に遷移させる(ことで親画面をログイン画面にする)
        window.location.href = './';
        return false;
    }
});

fragment에서는 포함하지 않는다 <!DOCTYPE html> 를 집어 갈까라고 생각했습니다만, 일단 로그인 화면에 한정한 구현으로 해 두려고.

역기이므로 더 스마트한 방법을 아시는 분은 꼭 코멘트를 부탁드립니다.

좋은 웹페이지 즐겨찾기