마이 페이지에 로그인 한 회원의 정보를 표시해보자!
@GetMapping("home/mypage")
public String mypage(@SessionAttribute(SessionConst.LOGIN_MEMBER) Member member, Model model) {
//세션에 LoginMember를 상수로 설정 -> SessionAttribute로 바로 가져올 수 있음
model.addAttribute("member", member);
log.info("My Page");
return "home/mypage/mypage";
}
로그인 시 세션에 저장한 값을 통해 회원 정보를 가져온다.
특히 여기서 비밀번호가 해쉬화하여 저장된 것을 볼 수 있다.
LoginController
@GetMapping("/logout")
public String logout(HttpServletRequest request) {
//세션을 삭제한다.
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
return "login";
}
세션 삭제 후 로그인 화면으로 돌아가게 한다.
<a href="/login" class="btn btn-bd-primary">돌아가기</a>
</div>
홈 화면으로 돌아가게 한다.
*참고 - 로그인 시 세션 처리 로직
SessionManager
@Component
public class SessionManager {
public static final String SESSION_COOKIE_NAME = "mySessionId";
private Map<String, Object> sessionStore = new ConcurrentHashMap<>();
/**
세션 생성
*/
public void createSession(Object value, HttpServletResponse response) {
//세션 id를 생성하고, 값을 세션에 저장
String sessionId = UUID.randomUUID().toString();
sessionStore.put(sessionId, value);
//쿠키 생성
Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId);
response.addCookie(mySessionCookie);
}
/**
세션 조회
*/
public Object getSession(HttpServletRequest request) {
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie == null) {
return null;
}
return sessionStore.get(sessionCookie.getValue());
}
/**
세션 만료
*/
public void expire(HttpServletRequest request, HttpServletResponse response) {
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie != null) {
//서버 측에서 쿠키 삭제
sessionStore.remove(sessionCookie.getValue());
//클라이언트 측에서도 쿠키 삭제
sessionCookie.setMaxAge(0);
sessionCookie.setPath("/login");
response.addCookie(sessionCookie);
}
}
/**
* @param request
* @param cookieName
* @return 쿠키 있으면 Cookie, 없으면 Null
*/
private Cookie findCookie(HttpServletRequest request, String cookieName) {
if (request.getCookies() == null) {
return null;
}
return Arrays.stream(request.getCookies())
.filter(cookie -> cookie.getName().equals(cookieName))
.findAny()
.orElse(null);
}
SessionConst
public class SessionConst {
//로그인한 사용자 정보를 세션에 저장할 때 사용되는 키 값을 상수로 정의
public static final String LOGIN_MEMBER = "loginMember";
}