티스토리 뷰

[로그인 상태에 따른 메뉴처리]


로그인 폼에서 유저 아이디와 비밀번호를 Post 방식으로 전송하여 Controller에서 받았다


[Controller]

@PostMapping("/login")
public String login(String userId, String password, HttpSession session){
User user=userRepository.findByUserId(userId);
if(user == null){
System.out.println("Login fail");
return "redirect:/users/loginForm";
}

if(!user.matchPassword(password)){
System.out.println("Login fail");
return "redirect:/users/loginForm";
}
System.out.println("Login Success");
session.setAttribute(HttpSessionUtils.USER_SESSION_KEY, user);

return "redirect:/";
}

- 유저 존재여부 확인 : userRepository에 해당 유저아이디의 객체가 있는지 확인하고 없다면 로그인 폼으로 redirect 한다.

- 비밀번호 일치 여부 확인 : 사용자가 입력한 비밀번호와 유저 객체의 비밀번호가 일치한지 확인하는 작업.

- Session 추가 : session.setAttribute() 함수를 사용하여 세션을 추가한다.


[View Page]

<div class="collapse navbar-collapse" id="navbar-collapse2">
<ul class="nav navbar-nav navbar-right">
<li class="active"><a href="../index.html">Posts</a></li>
{{^sessionedUser}}
<li><a href="/users/loginForm" role="button">로그인</a></li>
<li><a href="/users/form" role="button">회원가입</a></li>
{{/sessionedUser}}
{{#sessionedUser}}
<li><a href="/reservations/form" role="button"><b>Make Reserve</b></a></li>
<li><a href="/reservations" role="button"><b>Reservation List</b></a></li>
<li><a href="/users/logout" role="button">로그아웃</a></li>
<li><a href="/users/{{id}}/form" role="button">개인정보수정</a></li>
{{/sessionedUser}}
</ul>
</div>

Mustache 문법에서 처리 방법

- {{^sessionedUser}} {{/sessionedUser}} : sessionedUser가 없다면 이 코드 블록이 보여진다.

- {{#sessionedUser}} {{/sessionedUser}} : sessionedUser가 있다면 이 코드 블록이 보여진다


Mustache 문법 참고

Inverted Sections

An inverted section begins with a caret (hat) and ends with a slash. That is {{^person}} begins a "person" inverted section while {{/person}} ends it.

While sections can be used to render text one or more times based on the value of the key, inverted sections may render text once based on the inverse value of the key. That is, they will be rendered if the key doesn't exist, is false, or is an empty list.

Template:

{{#repo}}
  <b>{{name}}</b>
{{/repo}}
{{^repo}}
  No repos :(
{{/repo}}

Hash:

{
  "repo": []
}

Output:

No repos :(



[로그인 전 메뉴]



[로그인 후 메뉴]



[로그아웃]

@GetMapping("/logout")
public String logout(HttpSession session){
//session.invalidate();
/*session에 해당하는 이름을 매개변수로 넣어줘야 한다*/
session.removeAttribute(HttpSessionUtils.USER_SESSION_KEY);
return "redirect:/";
}

- session.removeAttribute(세션 이름) : 세션 이름에 해당하는 세션만 삭제한다.

- session.invalidate() : 내가 기존에 사용한 방법이다. 하지만 invalidate()의 단점은 모든 세션을 무효화 시킨다는 점에 있다. 특정 세션만 종료 시키고 싶다면 removeAttribute()를 사용해야 한다.













































댓글