2018-5-31 반복주기 4번째 Session
로그인기능
//UserController
@PostMapping("/login")
public String login(String userId, String password, HttpSession session) {
User user = userRepository.findByUserId(userId);
if (user == null)
return "redirect:/users/loginForm";
if (!password.equals(user.getPassword()))
return "redirect:/users/loginForm";
// login success
session.setAttribute("user", user);
return "redirect:/";
}
// UserRepository
public interface UserRepository extends JpaRepository<User, Long> {
// userId를 기반으로 조회를 할 수 있다.
User findByUserId(String userId);
}
- login을 구현을 할때 우리는 userId값으로 조회를 하고 싶다. 그래서 인터페이스에 findByUserId라는 메소드를 추가를 한다.
- 로그인 정보를 저장하기위해서 session을 추가한다. session에 해당 로그인값을 저장한다.
<div class="collapse navbar-collapse" id="navbar-collapse2">
<ul class="nav navbar-nav navbar-right">
<li class="active"><a href="/questions/form">Posts</a></li>
<li><a href="/users/loginForm" role="button">로그인</a></li>
<li><a href="/users/form" role="button">회원가입</a></li>
<li><a href="/users/loginout" role="button">로그아웃</a></li>
<li><a href="/users/{id}/edit" role="button">개인정보수정</a></li>
</ul>
</div>
- handlebars.expose-session-attributes=true : 어플케이션속성값에 넣어야 session-attribute가 된다.
- session에 저장된 데이터는 여러웹페페이지를 돌아다니더라도 남기때문에 로그아웃을 할때 처리를 해줘야한다.
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute("sessionedUser");
logger.debug("logout ok");
return "redirect:/";
}
- 세션에 있는 데이터를 로그아웃을 시킨다.
package codesquad.web;
import codesquad.domain.User;
import codesquad.domain.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/users")
public class UserController {
public static final Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserRepository userRepository;
@GetMapping("{id}/form")
public String updateForm(@PathVariable Long id, Model model, HttpSession session) {
Object tempUser = session.getAttribute("sessionedUser");
if (tempUser == null)
return "redirect:/users/loginForm";
User sessionedUser = (User)tempUser;
if (!id.equals(sessionedUser.getId()))
throw new IllegalStateException("You can't update the another user");
User user = userRepository.findOne(id);
model.addAttribute("user", user);
return "/user/updateForm";
}
@PutMapping("/{id}")
public String update(@PathVariable Long id, User updatedUser , HttpSession session) {
Object tempUser = session.getAttribute("sessionedUser");
if (tempUser == null)
return "redirect:/users/loginForm";
User sessionedUser = (User)tempUser;
if (!id.equals(sessionedUser.getId()))
throw new IllegalStateException("You can't update the another user");
User user = userRepository.findOne(id);
user.update(updatedUser);
userRepository.save(user);
return "redirect:/users";
}
@GetMapping("/loginForm")
public String loginForm() {
return "/user/login";
}
@PostMapping("/login")
public String login(String userId, String password, HttpSession session) {
User user = userRepository.findByUserId(userId);
if (user == null) {
logger.debug("login failed user is null");
return "redirect:/users/loginForm";
}
if (!password.equals(user.getPassword())) {
logger.debug("login failed");
return "redirect:/users/loginForm";
}
logger.debug("login success");
session.setAttribute("sessionedUser", user);
return "redirect:/";
}
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute("sessionedUser");
logger.debug("logout ok");
return "redirect:/";
}
}
- session이 너무 복잡해서 session을 관리하는 부분을 나눠야한다.
Written on May 31, 2018