본문 바로가기

카테고리 없음

[spring boot] 서버 재시작시 세션

아래는 컨트롤러의 일부분이다.

로그인에 성공하면 세션에 test, member값을 넣고 있다.

@PostMapping("/login")
public String login(@ModelAttribute("m") Member m, HttpServletRequest request, Model model) {
    model.addAttribute("login", "fail");
    HttpSession session;
    if (memberService.login(m)) {
        session = request.getSession();//세션이 없다면 세션생성.
        m.setNickName(memberRepository.findByLoginId(m.getLoginId()).getNickName());
        session.setAttribute("member", m);
        session.setAttribute("test", "myname!");
        model.addAttribute("isLogined", "true");
        return "index";//로그인 성공
    }
    return "loginFail";
}

 

인터셉터로 아래 와 같이 세션의 유무만을 탐지해서 코드를 짠 상태에서

로그인 - 서버 재시작 - 다시 인터셉터가 검증을 필요로 하는 /contents/writing/** 에 들어가면 통과해버린다. 

또한 session의 모든 키를 출력했을 때 로그인을 하지 않았음에도 로그인을 했을 때 들어가는 key가 있었다.

따라서 서버를 재시작해도 세션은 남아있다. spring에서는 설정으로 이를 조정할 수 있는데 부트에서는 어떻게 하는지 모르겠다.



@Component
@NoArgsConstructor
public class LoginInterceptor implements HandlerInterceptor {

    //인터셉터가 동작할 url을 넣어주는 리스트
    public List<String> loginEssential = Arrays.asList("/contents/writing/**");
    public List<String> loginInessential = Arrays.asList("");//비어있다.

    /**
     * @return true : 컨트롤러에 접근 승인, false : 컨트롤러에 접근 거부
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        Member m = (Member) request.getSession(false).getAttribute("member");//세션 없을 때 세션 생성 x
        HttpSession m =  request.getSession(false);//세션의 유무만을 확인하니까 통과해버린다. 
        Enumeration<String> em = m.getAttributeNames();
        System.out.println("모든 sesseion attri key");
        while (em.hasMoreElements()) {
            System.out.println(em.nextElement());
        }

        if (m != null) {
            return true;//접근허용
        } else {
            String destUri = request.getRequestURI();
            String destQuery = request.getQueryString();
            String dest = (destQuery == null) ? destUri : destUri + "?" + destQuery;
//            request.getSession().setAttribute("dest", dest); //굳이 세션에 등록할 필요가?
            response.sendRedirect("/member/login");
            return false;
        }
    }
}

일단 다음과 같이 세션의 값을 확인하는 코드로 바꾸었다. 

이렇게 하면 문제가 생기지 않는다. 왜 일까? 컨트롤러에서 member와 test는 같이 세션에 넣었는데 왜 test는 살아있고 member는 죽었을까?

-> 객체는 사라지고 string, integer 값 등은 남는다. 아래의 블로그에서도 똑같이 말하고 있다.

https://devmg.tistory.com/154

Member m = (Member) request.getSession(false).getAttribute("member");//세션 없을 때 세션 생성 x

 

@

아래와 같이 톰캣에는 세션 복구기능이 있다고 한다.

출처 http://itpsolver.com/%ED%86%B0%EC%BA%A3tomcat-%EC%9E%AC%EA%B8%B0%EB%8F%99restart%EC%8B%9C-%EC%84%B8%EC%85%98-%EB%B3%B5%EA%B5%AC-%EA%B8%B0%EB%8A%A5session-persistence%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80/