아래는 컨트롤러의 일부분이다.
로그인에 성공하면 세션에 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 값 등은 남는다. 아래의 블로그에서도 똑같이 말하고 있다.
Member m = (Member) request.getSession(false).getAttribute("member");//세션 없을 때 세션 생성 x
@
아래와 같이 톰캣에는 세션 복구기능이 있다고 한다.