JSP

#1 JSP Project 06(Blog) - 로그인/로그아웃

H-V 2021. 6. 30. 18:48

210630 유투버 '데어프로그래밍'님 강의 참조

 

loginForm.jsp 세팅

- form태그에 넣어서 보내면 데이터 타입은 무조건 'x-www-form-urlencoded'이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>

<div class="container">
	<form action="/blog/user?cmd=login" method="post"
		onsubmit="return valid()">
		<div class="form-group">
			<input type="text" name="username" id="username" class="form-control"
				placeholder="Enter Username" required />
		</div>
		<div class="form-group">
			<input type="password" name="password" class="form-control"
				placeholder="Enter Password" required />
		</div>
		<button type="submit" class="btn btn-primary">Login</button>
	</form>
</div>
</body>
</html>

- UserController에서 이미 로그인에대한 설정이 되어있기때문에 UserService에서 로그인()함수 마무리

public class UserService {
....
	public User 로그인(LoginReqDto dto) {
		return userDao.findByUsernameAndPassword(dto);
	}

- UserDao에 findByUsernameAndPassword() 함수 완성

public class UserDao {
	public User findByUsernameAndPassword(LoginReqDto dto) { // 회원가입
		// Admin은 DB에서 따로 변경하면 쉽다.
		// 1) 쿼리문 준비
		String sql = "SELECT id, username, email, address FROM user WHERE username = ? AND password = ? ";
		PreparedStatement pstmt = null;
		// 2) DB커넥션 연결
		Connection conn = DBConn.getConnection();
		ResultSet rs = null;
		try {
			// 3)
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, dto.getUsername());
			pstmt.setString(2, dto.getPassword());
			rs = pstmt.executeQuery();
			if (rs.next()) {
				User user = User.builder().id(rs.getInt("id")).username(rs.getString("username"))
						.email(rs.getString("email")).address(rs.getString("address")).build();
				return user;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally { // try-catch 상관없이 무조건 실행.
			// 코드가 길어지니 DBconn에서 함수로 따로 관리
			DBConn.close(conn, pstmt, rs);
		}
		return null;
	}

-UserController에서 로그인 마무리

} else if (cmd.equals("login")) {
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			LoginReqDto dto = new LoginReqDto();
			dto.setUsername(username);
			dto.setPassword(password);
			User userEntity = userSerivce.로그인(dto); //DB에서 받은것은 Entity 꼭!
			if(userEntity != null) {
				HttpSession session = request.getSession(); //로그인을 할수있으면 세션 부여
				session.setAttribute("principal", userEntity);//userEntity에 principal이라고 세션 줌
				response.sendRedirect("index.jsp"); //로그인 성공이면 메인화면으로
			} else {
				Script.back(response, "Login Failed");
			}

- 세션 테스트

테스트 성공!

- 로그인시 메인화면으로 가도록 header 수정

- 메인화면에는 게시물이 보이도록 하기위해서 jstl을 헤더에 설정해야한다. JSTL 라이브러리 삽입 및 코드 수정

- https://mvnrepository.com/artifact/jstl/jstl/1.2 다운로드 링크
(jstl용 jar파일은 초기에 세팅을 해두었다!)

- jstl을 쓰기위한 태그 삽입 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

*header.jsp

<nav class="navbar navbar-expand-md bg-dark navbar-dark">
  <a class="navbar-brand" href="index.jsp">Blog</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
    <span class="navbar-toggler-icon"></span>
  </button>
  <c:choose>
  	<c:when test="${sessionScope.principal !=null}">
  	<div class="collapse navbar-collapse" id="collapsibleNavbar">
    <ul class="navbar-nav">
      <li class="nav-item">
        <a class="nav-link" href="<%=request.getContextPath()%>/board?cmd=saveForm">Write</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="<%=request.getContextPath()%>/user?cmd=updateForm">Profile</a>
      </li>
            <li class="nav-item">
        <a class="nav-link" href="<%=request.getContextPath()%>/user?cmd=logout">Logout</a>
      </li>
    </ul>
  </div>  
  	</c:when>
  	<c:otherwise>
  	<div class="collapse navbar-collapse" id="collapsibleNavbar">
    <ul class="navbar-nav">
      <li class="nav-item">
        <a class="nav-link" href="<%=request.getContextPath()%>/user?cmd=joinForm">Sign-up</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="<%=request.getContextPath()%>/user?cmd=loginForm">Login</a>
      </li>
    </ul>
  </div>  
  	</c:otherwise>
  
  </c:choose>

로그인시 화면이 바뀐다!


- 로그아웃은 제일 간단하다. 세션만 빼고 나가게하면된다.

public class UserController extends HttpServlet {
....
} else if (cmd.equals("logout")) {
			HttpSession session = request.getSession();
			session.invalidate();
			response.sendRedirect("index.jsp");
		}

로그아웃도 잘되고 화면도 각기 다르다!