JAVA, JSP

java, jsp - 로그인, 로그아웃 구현

suji0730 2024. 8. 9. 15:51

 

1. 세션(Session)에 값 저장하기
session.setAttribute(String name, Object value);

2. 세션(Session)에 저장된 값 얻어오기
Object getAttribute(String name);

3. Getter/Setter
Getter와 Setter는 객체 지향 프로그래밍에서 사용되는 개념이며, 일종의 메서드라고 보면 된다. 
즉, 단어 그대로 Getter는 객체의 속성(property) 값을 반환하는 메서드이며, Setter는 객체의 속성 값을 설정, 변경하는 메서드라고 보면 된다.
JAVA의 request.getParameter() 메서드는 클라이언트가 전송한 HTTP요청의 매개변수를 가져오는데 사용되는 메서드 이다. 보통 HTTP GET 또는 POST요청에서 사용자가 입력한 데이터를 서버로 전송할 때 매개변수를 함께 전송하는데, 이 때 request.getParameter()를 사용하여 전달된 매개변수 값을 가져올 수 있다.

4. HttpServletRequest
Http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용
Header정보, Parameter, Cookie, URI, URL 등의 정보를 읽어들이는 메소드를 가진 클래스
Body의 Stream을 읽어들이는 메소드를 가지고 있음

5. HttpServletResponse
Servlet은 HttpServletResponse객체에 Content Type, 응답코드, 응답 메시지등을 담아서 전송함

 

 


 

LoginController.java

package login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import login.service.LoginServiceImpl;

@WebServlet("/login")
public class LoginController extends HttpServlet {
	
	// 2. 로그인 컨트롤러 service 메서드 동작 -> login으로 요청이 들어온 후 service 메서드가 호출된다  -> 3. 페이지 이동(login.jsp)
	
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//request.getParameter() 메서드 : HTTP 요청의 파라미터 값을 얻기 위해 사용하는 것
    	//4. String pageType변수 선언 후 클라이언트로부터 들어온 pageType변수에 담겨있는 move데이터 할당
    	String pageType = request.getParameter("pageType");
    	
    	//5. move데이터 비교
        if(pageType.equals("move")) {
        	//6. loginMove메서드 호출
        	loginMove(response);
        } else if(pageType.equals("action")) {
        	//8. pageType데이터가 action이기 때문에 loginAction메서드를 호출(login.jsp value="action")
        	loginAction(request, response);
        }
    }
    /*
     WAS가 웹브라우저로부터 Servlet요청을 받으면!!!
     1.요청을 받을 때 전달 받은 정보를 HttpServletRequest객체를 생성하여 저장
	 2.웹브라우져에게 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체)
	 3.생성된 HttpServletRequest(정보가 저장된)와 HttpServletResponse(비어 있는)를 Servlet에게 전달

     HttpServletRequest : Http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용
     HttpServletResponse : Servlet은 HttpServletResponse객체에 Content Type, 응답코드, 응답 메시지등을 담아서 전송함
    */
    
    public void loginMove(HttpServletResponse response) throws IOException {
    	//response.sendRedirect() 메소드 : 특정 조건일 때에 지정한 페이지로 이동하고 싶은 경우 사용되는 것
    	//7. /views/login.jsp로 이동
    	response.sendRedirect("/views/login.jsp");
    }
    
    public void loginAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//파라미터 값을 요청에서 가져옴
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");
        String userAddr = request.getParameter("userAddr");
        String userEmail = request.getParameter("userEmail");
        String userName = request.getParameter("userName");
        String userPhone = request.getParameter("userPhone");
        
        //DTO : 계층 간 데이터 교환을 위한 객체(로직을 가지지 않고 getter/setter 메소드만 가진 순수한 데이터 객체 클래스(Java Beans)로 DB에서 데이터를 얻어 service나 Controller 등으로 보낼 때 사용)
        
        //UserDTO 객체를 생성해서 사용자 정보를 설정
        UserDTO userDto = new UserDTO();
        userDto.setUserId(userId);
        userDto.setPassword(password);
        userDto.toString();
        
        //LoginServiceImpl 클래스의 service 메서드를 호출하여 로그인 처리. StatusDTO 객체를 반환?.
        LoginServiceImpl loginServiceImpm = new LoginServiceImpl();
        StatusDTO statusDto = loginServiceImpm.service(userDto);
        
        //로그인 성공했을 경우 : 세션 생성, 시간 설정, 사용자 정보를 세션에 저장(session.setAttribute("userDto", userDto)로 사용자 정보를 세션에 저장)
        //페이지 이동: request.getRequestDispatcher(statusDto.getUrl()).forward(request, response)로 지정된 url로 포워딩
        //로그인 실패했을 경우 : response.sendRedirect(statusDto.getUrl())로 실패 시 지정된 url로 리다이렉트.
        if(statusDto.getStatusType()) {
        	userDto.setUserAddr("전라북도 전주시");
        	userDto.setUserEmail("email1@email.com");
        	userDto.setUserName("홍길동");
        	userDto.setUserPhone("010-1234-5678");
            
            HttpSession session = request.getSession(); //세션 생성
            session.setMaxInactiveInterval(1800); //세션의 유효 시간을 1800초(30분)로 설정
            // 사용자 정보를 세션에 저장 : session.setAttribute(이름, 값)
            session.setAttribute("userDto", userDto);
        	request.getRequestDispatcher(statusDto.getUrl()).forward(request, response);
        } else {
        	response.sendRedirect(statusDto.getUrl());
        }
    }
}

 

 

LoginServiceImpl.java

package login.service;

import java.net.http.HttpRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import login.StatusDTO;
import login.UserDTO;

public class LoginServiceImpl {
	private static final String VALID_USERID = "admin";
    private static final String VALID_PASSWORD = "password";
    /*private static final을 선언한 변수를 사용하면 재할당하지 못하며, 
      메모리에 한 번 올라가면 같은 값을 클래스 내부의 전체 필드, 메서드에서 공유한다.
    */
    
    // 6. 로그인 id/pw검증
	public StatusDTO service(UserDTO userDto){
		StatusDTO stDto = new StatusDTO();
		 // 인증 로직
		 // 7. 검증결과에 따라 메인 페이지 이동 -> 값이 일치하면 /index.jsp , 불일치 시 login.jsp
        if (VALID_USERID.equals(userDto.getUserId()) && VALID_PASSWORD.equals(userDto.getPassword())) {
        	stDto.setStatusType(true); 
        	stDto.setUrl("/index.jsp");
        } else {
        	stDto.setStatusType(false); 
        	stDto.setUrl("/views/login.jsp?error=invalid");
        }
        return stDto;
	}
}

 

 

UserDTO.java

package login;

public class UserDTO {
	private String userId;
	private String password;
	private String userAddr;
	private String userEmail;
	private String userName;
	private String userPhone;
	
    public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getUserAddr() {
		return userAddr;
	}
	public void setUserAddr(String userAddr) {
		this.userAddr = userAddr;
	}
	
	public String getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public String getUserPhone() {
		return userPhone;
	}
	public void setUserPhone(String userPhone) {
		this.userPhone = userPhone;
	}
	/*
	Getter와 Setter는 객체 지향 프로그래밍에서 사용되는 개념으로 일종의 메서드라고 보면 된다. 
	Getter는 객체의 속성(property) 값을 반환하는 메서드, 
	Setter는 객체의 속성 값을 설정, 변경하는 메서드라고 보면 된다.
	*/
	
	@Override
	public String toString() {
		return "UserDTO [userId=" + userId + ", password=" + password + ", userAddr=" + userAddr + ", userEmail="
				+ userEmail + ", userName=" + userName + ", userPhone=" + userPhone + "]";
	}
	//toString 메서드 : 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드
}

 

 

LogoutController.java

package logout;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/logout")
public class LogoutController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //현재 세션을 무효화
        HttpSession session = request.getSession(false); 
        //현재 세션이 존재하는 경우 현재 세션을 검색하거나 현재 세션이 없는 경우 null을 검색. false 매개 변수를 사용하면 새 세션이 생성되지 않음.
        
        //세션이 있는 경우 세션 가져오고 새 세션을 만들지 않음
        if (session != null) {
            session.invalidate(); 
            //세션을 무효화(로그아웃)
        }
        //메인페이지로 리디렉션(지정한 페이지로 이동)
        response.sendRedirect(request.getContextPath() + "/views/logout.jsp");
    }
}
/*
Java Servlet 응용 프로그램에서 로그아웃을 처리하려면 일반적으로 현재 사용자 세션을 무효화하고 로그인페이지 또는 홈페이지로 이동해야 한다. 
 */

 

 

logout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="login.UserDTO" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	session.setAttribute("userDto", null);
	session.setMaxInactiveInterval(0);
	session.invalidate();
	response.sendRedirect("/index.jsp");
%>
</body>
</html>

 

 

userinfo.jsp

<%@ page import="login.UserDTO" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>userinfo</h2>
	<%
		UserDTO userDto = (UserDTO) session.getAttribute("userDto");
	%>
	<table border="1" cellspacing="0" width="250">
		<tr>
			<td>아이디</td>
			<td><%= userDto.getUserId() %></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><%= userDto.getPassword() %></td>
		</tr>
		<tr>
			<td>주소</td>
			<td><%= userDto.getUserAddr() %></td>
		</tr>
		<tr>
			<td>이메일</td>
			<td><%= userDto.getUserEmail() %></td>
		</tr>
		<tr>
			<td>이름</td>
			<td><%= userDto.getUserName() %></td>
		</tr>
		<tr>
			<td>번호</td>
			<td><%= userDto.getUserPhone() %></td>
		</tr>
	</table>
</body>
</html>

 

 

 

index.jsp

<%@ page import="login.UserDTO" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0
    response.setDateHeader("Expires", 0); // Proxies
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	body{margin: 0}
	ul {width: 1600px; height: 80px; line-height: 80px; margin: auto;}
	ul li{list-style: none; float: left; margin-right: 50px;}
	a {font-size: 30px; text-decoration: none; color: #fff;}
	a:hover {color: red; transition : 0.3s;}
	input:focus {color: red;}
	li:active {color: red;}
	nav {border-bottom: 1px solid #d2d2d2; width: 100%;}
	iframe {width:100%; height:100vh;}
</style>
</head>
<body>
	<section style="position: fixed; background: rgba(0, 0, 0, 0.5); height: 80px;">
		<header>
			<nav>
				<ul>
					<li><a href="index.jsp">홈</a></li>
					<!-- 페이지 타입의 데이터에 따라 어느 페이지로 이동할건지?
						list = 목록
						detail = 상세
						modify = 수정
						add = 등록
						/product?pageType=list
					 -->
					<li><a href="/product?pageType=list">상품</a></li>
					<li><a href="#">메뉴3</a></li>
					<li><a href="#"></a></li>
					<!-- 서버 실행 시 최초로 접근하는 index.jsp -->
					<%
						UserDTO userDto = (UserDTO) session.getAttribute("userDto");	
						//세션(session)에 저장된 UserDTO 값 얻어오기 : Object getAttribute(String name);
						
						//1.UserDTO객체의 값이 null이라면 <li><a href="/login?pageType=move">로그인</a></li> 출력
						if (userDto == null) {
					%>
					<!-- 1. 로그인 버튼 클릭  
						href="/login?pageType=move" -> get방식으로 웹 서버에 요청
						/login url 요청
						요청할 때 pageType 변수에 move데이터 할당 후 
						
						get방식 : URL 뒤에 파라미터를 추가하여 전달
						  		URL뒤에 ? 를 사용하여 파라미터를 작성하게 되고 & 을 붙여 여러개의 파라미터를 구분하게 된다.
						pageType=move -> LoginController.java
										2.로그인 컨트롤러 service 메서드 동작
					-->
							<li><a href="/login?pageType=move">로그인</a></li>
							<!-- <li><a href="/views/join.jsp">회원가입</a></li>  -->
					<%
						} else {
							if(userDto == null){//로그아웃후에 main페이지로 주소값을 입력해도 접속되지않게 방지 (홈페이지호출)
								response.sendRedirect("index.jsp");
							}
					%>
							<li><a href="#">환영합니다, <%= userDto.getUserId() %>님!</a></li>
							<!-- 8. 메인 페이지에 유저정보 표출(session에 담긴 유저)
									(저장된 값과 일치할 때 유저정보 표출 -->
									
							<li><a href="<%=request.getContextPath()%>/views/userinfo.jsp">회원정보</a></li>
							<li><a href="<%=request.getContextPath()%>/logout">로그아웃</a></li>
					<%
						}
					%>
				</ul>
			</nav>
		</header>
	</section>
	<section>
		<div>
			<iframe src="https://www.youtube.com/embed/c9g7InVY-RU?si=p2PrcHNu5B3Vzh1K" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
		</div>
	</section>
</body>
</html>