티스토리 뷰

Web

Ch13. MVC 3 : 세션 (로그인 유지)

tose33 2022. 7. 23. 19:14

로그인 상태를 유지하는 방법은 크게 HttpSession을 이용하는 방법과 쿠키를 이용하는 방법이 있다.

 

컨트롤러에서 HttpSession 사용하기

 

로그인 

요청 매핑 애노테이션 적용 메서드에 HttpSession 파라미터가 존재할 경우 스프링 MVC는 해당 메서드를 호출할때 HttpSession 객체를 파라미터로 전달한다.

HttpSession을 생성하기 전이면 새롭게 생성하고 그렇지 않으면 기존에 존재하는 HttpSession을 전달한다.

 

LoginController 클래스의 submit() 메서드를 로그인후 인증 정보를 세션에 담도록 수정.

submit 메서드는 로그인 페이지에서 로그인 버튼 눌렀을시 호출되는 메서드다.

	// 로그인 버튼 눌렀을때 처리 
	@PostMapping
	public String submit(LoginCommand loginCommand, Errors errors,
			HttpSession session) 
	{
		// 에러 있으면 errors에 담김 
		new LoginCommandValidator().validate(loginCommand, errors);
		
		if(errors.hasErrors())
		{
			return "login/loginForm";
		}
		
		// login 시도함 
		try 
		{
			AuthInfo authInfo = authService.authenticate(
					loginCommand.getEmail(), loginCommand.getPassword());
			
			// TODO 세션에 authInfo 저장해야 함 
			session.setAttribute("authInfo", authInfo); 
			
			return "login/loginSuccess";
		} catch(WrongIdPasswordException e) 
		{
			errors.reject("idPasswordNotMatching"); // global error 
			return "login/loginForm";
		}
	}

 

세번째 파라미터에 HttpSession이 추가됐다.

try문 내부에서 로그인 시도한 정보가 AuthInfo에 담기고, HttpSession의 "authInfo" 속성에 인증 정보 객체 AuthInfo를 담았다.

 

 

로그아웃

로그아웃 시에는 로그인 될때 만들었던  HttpSession을 제거하면 된다.

HttpSession.invalidate() 메서드로 제거한다.

 

LogoutController.java

package controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LogoutController 
{
	@RequestMapping("/logout")
	public String logout(HttpSession session) 
	{
		session.invalidate(); // 세션 제거 
		return "redirect:/main"; // main으로 리다이렉트 
	}
}

 

ContollerConfig 설정 클래스에 LogoutController 빈을 추가한다.

그리고 이제 메인 페이지 폼인 main.jsp를 수정한다.

 

main.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
	<title>메인</title>
</head>

<body>
	<%-- 로그인 성공했다면 HttpSession에 authInfo 객체 저장되어 있을것  --%>
	<%-- login 정보없음  --%>
	<c:if test="${empty authInfo }" > 
	<p>환영합니다</p>
	<p>
		<a href="<c:url value="/register/step1" />">[회원 가입하기]</a>
		<a href="<c:url value="/login" />">[로그인]</a>
	</p>
	</c:if>
	
	<%-- login 정보있음  --%> 
	<c:if test="${!empty authInfo }" >
	<p>${authInfo.name}님, 환영합니다. </p>
	<p>
		<a href="<c:url value="/edit/changePassword"/>">[비밀번호 변경]</a>
		<a href="<c:url value="/logout"/>">[로그아웃]</a>
	</p>
	</c:if>

</body>
</html>

 

main.jsp를 보면 jstl의 <c:if> 태그의 test 값으로 authInfo가 empty인지 확인하고 있다.

 

즉 authInfo가 없으면 로그인 하지 않은 상태이므로 [회원 가입하기]와 [로그인] 링크를 보여주고,

authInfo가 있으면 로그인한 상태이므로 {이름}님, 환영합니다 를 보여준다.

 

 

 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저) 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함