게시판4) 로그인 페이지

1. 입력받은 id 와 password의 정보를 db와 매치시켜 로그인 할 수 있게 한다.
2. HttpSession 객체를 통해 로그인 중인지 아닌지를 판별하고, 페이지를 다르게 보여줄 수 있다.
3. Cookie를 사용해 아이디 저장 기능을 사용할 수 있다.
4. return "redirect:"; 의 의미를 안다.

전체 코드는 맨 아래 있고, 과정 과정 설명할 때는 전체보단 부분에 집중하는 코드를 본다.

1127sp1

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 게시판 포스팅 시리즈 ◇

  1. Spring 과 DB 연결하기
  2. 회원 가입 화면 구성
  3. ID 중복 확인 하기
  4. 로그인 페이지 만들기 - 현재 글
  5. 게시판 화면 구성하기
  6. 글 쓰기 기능 구현
  7. 글 확인 기능 구현
  8. 글 수정 기능 구현
  9. 게시판 페이징
  10. 파일 첨부 기능
  11. 파일 다운 기능
  12. MIME 타입
  13. 글 수정시 파일 변경

© 2018. All rights reserved.

Powered by Hydejack v8.5.2