게시판4) 로그인 페이지
in Web Dev on Java Spring
1. 입력받은 id 와 password의 정보를 db와 매치시켜 로그인 할 수 있게 한다.
2. HttpSession 객체를 통해 로그인 중인지 아닌지를 판별하고, 페이지를 다르게 보여줄 수 있다.
3. Cookie를 사용해 아이디 저장 기능을 사용할 수 있다.
4. return "redirect:"; 의 의미를 안다.
전체 코드는 맨 아래 있고, 과정 과정 설명할 때는 전체보단 부분에 집중하는 코드를 본다.
1. 입력 받은 ID, PWD를 DB에서 찾기
- form과 submit으로 서버에 정보 날리기는 5번 방법에 자세히 써놨다.
login.jsp
<form id= "form" action = "login" method="POST">
<input type= "text" id = "userid" name ="userid" placeholder ="3~5자 아이디">
<input type= "password" id = "userpwd" name ="userpwd" placeholder ="3~5자 비번">
<input type="submit" id = "btn_login" value = "로그인">
</form>
컨트롤러 객체 함수의 parameter를 위 링크 5번 방법을 따르면 다음과 같이 jsp의 input 변수 값을 받아올 수 있다.
public String login(String userid , String userpwd) {}
그러나 다음과 같이 쓸 수도 있다.
public String login(Member member) {}
controller - memberController.java
저렇게 쓰는게 가능한 이유는, member 에 userid와 userpwd라는 변수가 존재하고, spring 객체에서 알아서 setter로 이 객체에 두가지 변수를 집어넣어주기 때문이다.
그리고 이 member를 repository에 전달해준다.
@RequestMapping(value = "/login", method = RequestMethod.POST) public String login(Member member) { Member m= repository.selectOne(member); return "index"; }
repository - memberRepository.java
- repository에서는 interface를 객체화 시켜서 함수 호출해준다.
public Member selectOne(Member member) {
Map<String, String> map = new HashMap<>();
MemberMapper mapper = session.getMapper(MemberMapper.class);
map.put("userid",member.getUserid());
map.put("userpwd",member.getUserpwd());
Member m = mapper.selectOne(map);
return m;
}
MemberMapper.xml
<select id = "selectOne" parameterType = "map" resultType = "Member">
SELECT
userid, userpwd, gender, email,phone,hobby,to_char(birth,'YYYY-MM-DD'), address
FROM member
WHERE userid= #{userid} AND userpwd= #{userpwd}
</select>
2. 로그인 중인지 판별(HttpSession 객체)
- HttpSession session를 param 으로 쓴다. session 객체에 저장된 자료들은 브라우저가 완전히 닫힐 때 까지 저장된다.
controller - memberController.java
- 로그인 정보가 있다면, session.setAttribute를 이용해 session 에 정보를 저장한다.
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(Member member,HttpSession session)
Member m= repository.selectOne(member);
if (m == null) {//로그인 정보 없음
return "member/loginForm";
}else {
//로그인을 정확히 했을 때의 로직이 필요함
session.setAttribute("loginId",m.getUserid());
session.setAttribute("loginName", m.getUserid());
return "index";
}
이렇게 서버에 저장된 정보는 jsp에서 ${}를 이용해 가져올 수 있다.
- taglib의 jstlcore를 사용해 if문으로 경우의 수를 나눠서 화면을 보여주게 한다.
index.jsp
- HttpSession에 저장된 정보는 jsp파일에서 ${sessionScope.키이름}으로 받을 수 있다.
- <c:if test=”${sessionScope.loginId == null }”> 를 사용해, 세션에 loginId가 있을때와 없을 때 화면을 달리해줄 수 있다.
<h1>[ 회원 게시판 ]</h1>
<!-- session 에 넣은 정보를 가지고 index 화면에 넣어주는 것이 다르다. -->
<ul>
<c:if test="${sessionScope.loginId == null }">
<li><a href = "join">회원가입</a></li>
<li><a href = "login">로그인</a></li>
</c:if>
<c:if test="${sessionScope.loginId !=null }">
<li>${sessionScope.loginName}님, <a href = "logout">로그아웃</a></li>
<li><a href = "">개인정보 수정</a></li>
</c:if>
<li><a href = "boardlist">게시판</a></li>
</ul>
3. 아이디 저장 기능 (Cookie 객체)
- Cookie는 다음번 접속시에 사용자 세팅을 저장해놓게 할 수 있다. id저장할 때 사용한다.
controller - memberController.java
- Cookie cookie = new Cookie(“키”,value);로 저장해 줄 수 있다.
- setMaxAge(초); 로 쿠키의 유지시간을 정할 수 있다.
- HttpServletResponse 객체를 사용해 response.addCookie(cookie);를 해 쿠키를 더해준다.
public String login(Member member,
boolean saveid,
Model model,
HttpSession session,
HttpServletResponse response) {
if(saveid) {
Cookie cookie = new Cookie("saveid", member.getUserid());
cookie.setMaxAge(24*60*60);//하루 유지.
response.addCookie(cookie);
}else {
//
Cookie cookie = new Cookie("saveid", null);
cookie.setMaxAge(0);//쿠키 삭제
response.addCookie(cookie);
}
4. logout, redirect:/ 로 인덱스 리로딩
controller - memberController.java
- session.invalidate();로 session 을 종료시키고, 담긴 정보를 지울 수 있다.
- 컨트롤러 내부에 있는 함수들끼리 호출할 수 없다. 따라서 redirect 를 이용해서 호출해준다.
//http 세션, 로그아웃 처리
@RequestMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
login 함수 전체코드
//http 세션, 로그인 처리
@RequestMapping(value = "/login", method = RequestMethod.POST)
//saveid 변수 이름이 index jsp의 변수 그거와 같아야한다.
public String login(Member member,
boolean saveid,
Model model,
HttpSession session,
HttpServletResponse response) {
Member m= repository.selectOne(member);
String message = null;
if(saveid) {
Cookie cookie = new Cookie("saveid", member.getUserid());
cookie.setMaxAge(24*60*60);//하루 유지.
response.addCookie(cookie);
}else {
//
Cookie cookie = new Cookie("saveid", null);
cookie.setMaxAge(0);//쿠키 삭제
response.addCookie(cookie);
}
if (m == null) {//로그인 정보 없음
message= "로그인 할 수 없습니다.";
model.addAttribute("message",message);
return "member/loginForm";
}else {
//로그인을 정확히 했을 때의 로직이 필요함
session.setAttribute("loginId",m.getUserid());
session.setAttribute("loginName", m.getUserid());
return "index";
}
}
//http 세션, 로그아웃 처리
@RequestMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
◇ Spring 게시판 포스팅 시리즈 ◇