자바 웹 프로그래밍

준비중..

자바 웹 프로그래밍

나만의 웹사이트를 만들어 보자!

09 JSP를 만나다: 로그인 / 로그아웃

# JSP를 만나다: 로그인 / 로그아웃 앞서 배운 내용들을 토대로 로그인/로그아웃 서비스를 만들어 보자. ## 목차 1. 학습 목표 2. 흐름 설계 3. 화면 설계 4. 코드 구현 5. 추가 구현 ## 학습 목표 + Bootstrap을 활용한 프론트엔드 구현 + form 태그의 이해 및 활용 + JSP 문법의 이해 및 활용 + request 객체와 response 객체의 활용 ## 흐름 설계 로그인 / 로그아웃 서비스를 만들려면 어떻게 해야할까? 고민해보고 사용자의 상태 흐름을 페이지로 설계해보자. . . . 충분히 고민 했다면 아래 흐름과 비교 후, 수정해본다. ![Imgur](https://i.imgur.com/gskR4sC.png) ## 화면 설계 사용자의 입장에서 화면은 어떻게 설계해야할까? 아래를 참고한다. ![Imgur](https://i.imgur.com/lYMscGC.png) ## 코드 구현 위의 설계 내용을 토대로 코드를 작성하자. `form.jsp` - 로그인 폼 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <title>Hello JSP</title> </head> <body class="container"> <div class="jumbotron"> <h1>Form</h1> <p>폼을 통해 데이터 전송해봅시다.</p> </div> <!-- 로그인 실패 시 경고: https://getbootstrap.com/docs/4.1/components/alerts/#dismissing --> <% if (request.getParameter("error") != null) { %> <div class="alert alert-warning alert-dismissible fade show" role="alert"> <strong>로그인 에러!</strong> 이메일 또는 비밀번호가 일치하지 않습니다. <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <% } %> <!-- 로그인 폼: https://getbootstrap.com/docs/4.1/components/forms/ --> <form action="auth.jsp" method="post"> <div class="form-group"> <label>이메일</label> <input name="email" type="email" class="form-control" /> </div> <div class="form-group"> <label>비밀번호</label> <input name="password" type="password" class="form-control" /> </div> <button type="submit" class="btn btn-primary">전송</button> </form> <!-- Optional JavaScript --> <Script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <Script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script> </body> </html> ``` `auth.jsp` - 폼 데이터를 받고, 페이지를 이동 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%! class User { private String email; private String password; public User(String email, String password) { this.email = email; this.password = password; } public boolean check(String email, String password) { // 이메일이 같지않다면? if (!email.equalsIgnoreCase(this.email)) return false; // 비밀번호가 다르다면? if (!password.equals(this.password)) return false; // 모두 통과했다면? return true; } } %> <% /* 1. 폼 데이터를 받아오시오. (구글링: jsp request form 값 받기) */ String inputEmail = request.getParameter("email"); String inputPassword = request.getParameter("password"); // 등록된 사용자 데이터. String[] emails = {"[email protected]", "[email protected]", "[email protected]"}; String[] passwords = {"admin123", "tester123", "user123"}; User[] users = new User[emails.length]; for (int i = 0; i < emails.length; i++) { users[i] = new User(emails[i], passwords[i]); } // 폼 데이터 정보가 등록된 사용자들 중 있는지 검사. for (User u: users) { // 이메일과 패스워드가 일치한다면? if (u.check(inputEmail, inputPassword)) { /* 2. welcome.jsp로 이동시키시오. (구글링: jsp response 페이지 redirect)*/ response.sendRedirect("welcome.jsp?email=" + inputEmail); return; } } // 사용자 인증을 못받았다면? /* 3. form.jsp 페이지로 이동시키시오. (구글링: jsp response 페이지 redirect) */ response.sendRedirect("form.jsp?error=login-failed"); %> ``` `welcome.jsp` - 이메일 정보를 출력 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <title>Hello JSP</title> </head> <body class="container"> <div class="jumbotron"> <h1>Welcome</h1> <p><%= request.getParameter("email") %>님 반갑습니다.</p> <a href="form.jsp" class="btn btn-primary">로그아웃</a> </div> <!-- Optional JavaScript --> <Script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <Script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script> </body> </html> ``` ## 추가 구현 로그아웃 시, 로그인이 되었습니다 문구를 출력해보자. ## 요약 1. 폼 태그의 input은 name 속성을 변수로 하여 전달된다. 2. request 객체의 getParameter() 메소드는 폼 태그로부터 전달된 데이터를 반환한다. 3. response 객체의 sendRedirect() 메소드는 클라이언트를 다른 url로 이동시킨다.