본문 바로가기

개발/Web

[Java] Sevlet/JSP - 회원서비스 - 로그인 / 로그아웃

회원서비스

< 로그인 >

 

1. 로그인 화면 

- 어디에서나 보이는 menubar.jsp에 작성

- 로그인 전 / 후로 조건을 주어 보여줄 div영역 다르게 작성

- Form태그로 아이디와 비밀번호를 받아서 요청시 전달

<div class="login-area">
    <% if(loginUser == null) { %>		
        <!-- 사용자가 로그인 전 보게 될 화면 -->
        <!--  <form action="/jsp/login.me" method="post"> -->
        <form action="<%= contextPath %>/login.me" method="post">
            <table>
                <tr>
                    <th>아이디</th>
                    <td><input type="text" name="userId" required></input></td>
                </tr>
                <tr>
                    <th>비밀번호</th>
                    <td><input type="password" name="userPwd" required></td>
                </tr>
                <tr>
                    <th colspan="2">
                        <button type="submit">로그인</button>
                        <button type="button" onclick="enrollPage();">회원가입</button>
                    </th>
                </tr>		
            </table>
        </form>
    <% } else { %>
        <!-- 사용자가 로그인 성공 시 보게 될 화면 -->
        <div id="user-info">
            <b><%= loginUser.getUserName() %></b>님 환영합니다~!! <br><br>
            <div align="center">
                <a href="<%= contextPath %>/myPage.me">마이페이지</a>
                <!-- <a href="/jsp/logout.me">로그아웃</a> -->
                <a href="<%= contextPath %>/logout.me">로그아웃</a>
            </div>		
        </div>		
    <% } %>		
</div>

 

2. MemberLoginController.java (Servlet)

- 매핑값 : /login.me

- 로그인 실패 시 에러페이지

- 로그인 성공 시 사용자의 정보를 session으로 넘기며 welcome page 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // 1) 요청 방식 생각! => POST 방식일 경우 인코딩 설정
    request.setCharacterEncoding("UTF-8");

    // 2) 요청 시, 전달한 값을 꺼내서 변수에 기록 => request의 Parameter영역
    String userId = request.getParameter("userId");
    String userPwd = request.getParameter("userPwd");

    // 3) 해당 요청을 처리해주는 서비스클래스의 메소드를 호출
    Member loginUser = new MemberService().loginMember(userId, userPwd);

    // 4) 처리된 결과를 가지고 사용자가 보게 될 응답화면을 지정
    if(loginUser == null) { // 로그인 실패
        // 에러 메시지 넘기기
        request.setAttribute("errorMsg", "로그인에 실패했습니다.");
        RequestDispatcher view = request.getRequestDispatcher("views/common/errorPage.jsp"); 
        // forward메소드 호출 (포워딩) - 응답페이지로 보내줌
        view.forward(request, response);

    } else { // 로그인 성공 => index.jsp페이지 응답

        // 사용자의 정보 넘기기 - 다른 페이지에서도 봐야 함 (Session에 담기)
        HttpSession session = request.getSession();
        session.setAttribute("loginUser", loginUser);

        // 로그인 성공했을때만 띄워줄 메시지
        session.setAttribute("alertMsg", "로그인에 성공했습니다.");
        RequestDispatcher view = request.getRequestDispatcher("index.jsp"); // WebContent폴더 기준으로
        view.forward(request, response);
    }
}

 

3. MemberService.java (자바Class)

- loginMember()

- Connection객체와 아이디, 비밀번호를 Dao로 전달

- 결과를 Controller로 반환

public Member loginMember(String userId, String userPwd) {

    Connection conn = JDBCTemplate.getConnection();
    // SQL 실행 관련 객체에 대한 메소드를 JDBCTemplate에 정의해놓음
    
    Member m = new MemberDao().loginMember(conn, userId, userPwd);

    JDBCTemplate.close(conn);

    return m;	
}

 

 

4. MemberDao.java (자바Class)

- DAO 기본

- DB에 접속하기 위한 정보와 SQL문이 담긴 'XML'파일 읽기

public class MemberDao {
	// 필드
	private Properties prop = new Properties();

	// 기본생성자 초기화블록
	public MemberDao() {
		String file = MemberDao.class.getResource("/sql/member/member-mapper.xml").getPath();
		// 같은 경로를 받을 수 있도록 .class파일(자바 실행 파일)을 기준으로 상대경로방식으로 지정해서 xml파일의 위치를 나타냄
        try {
            prop.loadFromXML(new FileInputStream(file)); // XML파일 읽기 - loadFromXML()
        } catch (IOException e) {
            e.printStackTrace();
        }
	}
}

- loginMember()

- SQL문(SELECT문)실행 후, 결과로 돌아온 회원 정보를 Member객체에 담아 반환

public Member loginMember(Connection conn, String userId, String userPwd) {

    // SELECT문 => ResultSet객체(Unique key 조건에 의해 한 행만 조회됨) -> Member

    Member m = null; 
    PreparedStatement pstmt = null;
    ResultSet rset = null;

    String sql = prop.getProperty("loginMember");

    try {
        pstmt = conn.prepareStatement(sql); // pstmt객체 생성 - 예외처리

        pstmt.setString(1, userId);
        pstmt.setString(2, userPwd);
        
        rset = pstmt.executeQuery();

        if(rset.next()) {
            m = new Member(rset.getInt("USER_NO"),
                           rset.getString("USER_ID"),
                           rset.getString("USER_PWD"),
                           rset.getString("USER_NAME"),
                           rset.getString("PHONE"),
                           rset.getString("EMAIL"),
                           rset.getString("ADDRESS"),
                           rset.getString("INTEREST"),
                           rset.getDate("ENROLL_DATE"),
                           rset.getDate("MODIFY_DATE"),
                           rset.getString("STATUS"));	
        } 
    } catch (SQLException e) {
        e.printStackTrace();
    } finally { // 자원반납 -> 생성된 순서의 역순
        JDBCTemplate.close(rset);
        JDBCTemplate.close(pstmt);
    }
    return m;		
}

- SQL문

<entry key="loginMember">
    SELECT 
           USER_NO,
           USER_ID,
           USER_PWD,
           USER_NAME,
           PHONE,
           EMAIL,
           ADDRESS,
           INTEREST,
           ENROLL_DATE,
           MODIFY_DATE,
           STATUS
      FROM 
            MEMBER
     WHERE 
            USER_ID = ?
       AND 
            USER_PWD = ?
       AND
            STATUS = 'Y'
</entry>

 

 

< 로그아웃 >

 

1. 로그아웃 화면

- request.getContextPath()로 얻어낸 contextRoot경로를 변수로 저장 -> 출력식에 넣어 사용

<a href="<%= contextPath %>/logout.me">로그아웃</a>

 

2. LogoutContoller.java (Servlet)

- 매핑값 : /logout.me

- session을 무효화하여 session에 담은 loginUser값을 지우기

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // a태그로 보낸 요청은 GET방식 - url에 요청값이 보여짐
    
    // 로그아웃 요청에 대한 처리 => session을 만료시킨다(== 무효화한다)
    // 무효화 메소드 == invalidate() => session에서 제공하는 메소드
    HttpSession session = request.getSession();
    session.invalidate();
    
    response.sendRedirect(request.getContextPath()); // contextRoot로
}