본문 바로가기
개발 공부 Today I Learned

[국비 38일차 TIL] 로그인 페이지 세션, 로그아웃

by 개발자신입 2024. 1. 15.
반응형

 

session


세션 만들기 (★★★ 매우 중요함! 외워~ ★★★)

HttpSession session = request.getSession();

session.setAttribute("mname", dto.getMname()); // mname이라는 이름으로 세션 생성

session.setAttribute("mid", dto.getMid()); // mid라는 이름으로 세션 생성


board.jsp 부분의 아래 내용 중요함.

${sessionScope.mname }님 반갑습니다~

 

<li onclick="url('./logout')">로그아웃</li> <!-- 세션을 종료시키고 다시 로그인 페이지로 (서블릿만 필요함, jsp 필요없음) -->

 


 

detail.jsp

게시글을 클릭했을 때, 삭제와 수정 아이콘이 나오도록 해야한다.

내가 쓴 글의 삭제와 수정은 나만 할 수 있도록 수정했다. 

 

<article>
		<div class="detailDIV">
			<div class="detailTITLE">
				${detail.title }
			</div>
			<div class="detailWRITECOUNT">
				<div class="detailWRITE">
				${detail.write }
				<c:if test="${sesseionScope.mname ne null && detail.mid eq sessionScope.mid }">
					<img alt="삭제" src="./img/delete1.png" onclick="del()">
					<img alt="수정" src="./img/update1.png" onclick="update()">
				</c:if>
				</div>
				<div class="detailCOUNT">${detail.count }</div>
			</div>
			<div class="detailCONTENT">
				${detail.content }
			</div>

 

 

 login.java

 

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 javax.websocket.Session;

import com.coffee.dao.MemberDAO;
import com.coffee.dto.MemberDTO;

@WebServlet("/login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Login() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		String url = "";
		if(session.getAttribute("mname") != null ) {
			url = "alreadylogin.jsp";
		} else {
			url = "login.jsp";
		}
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}
	
// 아래의 방법도 가능!
//		RequestDispatcher rd = null;
//		if (session.getAttribute("mname") != null) {
//			rd = request.getRequestDispatcher("alreadylogin.jsp");
//		} else {
//			rd = request.getRequestDispatcher("login.jsp");
//		}
//		rd.forward(request, response);
//	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 2024-01-12 웹 서버 프로그래밍 구현
		if(request.getParameter("id") != null && request.getParameter("pw") != null) {
			MemberDTO dto = new MemberDTO();
			dto.setMid(request.getParameter("id"));
			dto.setMpw(request.getParameter("pw"));
			
			MemberDAO dao = new MemberDAO();
			dto = dao.login(dto);
			
			if(dto.getCount() == 1) {
				System.out.println("정상 로그인");
				// 세션 만들기 (★★★ 매우 중요함! 외워~ ★★★)
				HttpSession session = request.getSession();
				session.setAttribute("mname", dto.getMname()); // mname이라는 이름으로 세션 생성
				session.setAttribute("mid", dto.getMid()); // mid라는 이름으로 세션 생성
				
				// 페이지 이동 = board
				response.sendRedirect("./board");
				
			} else {
				System.out.println("로그인 불가 오류");
				// 페이지 이동 = login?error=4567
				response.sendRedirect("./login?error=4567");
			}
		} else {
			
		}
	}
}

 

 

logout.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!-- 선언문 core태그 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그아웃 페이지입니다.</title>

<link href="./css/index.css" rel="stylesheet">
<link href="./css/menu.css" rel="stylesheet">
<script type="text/javascript" src="./js/menu.js"></script>

</head>
<body>
	<header>
		<%@ include file="menu.jsp"%>
	</header>
	<div class="main">
		<div class="mainStyle">
			<article>
				<h1 style="text-align: center">정상적으로 로그아웃 되었습니다.</h1>
			</article>
		</div>
	</div>
		<footer>
		<c:import url="footer.jsp"/>
		</footer>
</body>
</html>

 

logout.java

 

<세션 쿠키>

  세션 쿠키
  서버에 저장됨. 클라이언트에 저장(브라우저)
  로그인 정보 쇼핑정보, 장바구니, 방문 정보 등
  자바 스크립트

 

60분이 지나면 세션이 자동 종료되도록.

 

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 Logout extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Logout() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		// 세션 종료
		HttpSession session = request.getSession();
		if (session.getAttribute("mname") != null) {
			session.setMaxInactiveInterval(3600); // 시간 연장
//			System.out.println("세션 유효시간 : " + session.getMaxInactiveInterval());
//			System.out.println("mname : " + session.getAttribute("mname"));
			session.removeAttribute("mname");
		}
		if(session.getAttribute("mid") != null){
//			System.out.println("mid : " + session.getAttribute("mid"));
			session.removeAttribute("mid");
		}
		session.invalidate(); // 위의 removeAttribute를 따로 할 필요없이, 세션 모두 삭제
		// invalidate()는 세션 자체를 무효화 및 제거
		// removeAttribute()는 현재 세션에서 특정 key-value만 제거
		// removeAttribute()로 키만 제거하면 httpSession 인스턴스가 남아있어 invalidate() 하는 것이 좋음.
		
		// login 페이지로 전송
//		response.sendRedirect("./logout.jsp");
		RequestDispatcher rd = request.getRequestDispatcher("logout.jsp");
		rd.forward(request, response);
	}

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

}

 

 

write.java 

 

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 com.coffee.dao.BoardDAO;
import com.coffee.dto.BoardDTO;

@WebServlet("/write")
public class Write extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Write() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 세션 검사
		HttpSession session = request.getSession();
		
		if(session.getAttribute("mname") == null) {
			response.sendRedirect("./login");	// url까지 변경해서 화면 보여주기
		} else {
			RequestDispatcher rd = request.getRequestDispatcher("write.jsp"); // url고정, 화면만 표시 : 로그인했으면 write 페이지로.
			rd.forward(request, response);
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 한글처리
		request.setCharacterEncoding("UTF-8");
		
		// 세션에 들어있는 mid 가져오기 24-01-15 
		HttpSession session = request.getSession();

		// if문으로 로그인 되어있는(=세션이 있는) 사람만 아래 로직 수행하도록 변경
		if(session.getAttribute("mid") == null || session.getAttribute("mname") == null) {
			// 로그인하지 않았다면 login 으로 전송
			response.sendRedirect("./login?login=login");
		} else {
			// 로그인했다면 아래 로직을 수행하도록
			String title = request.getParameter("title");
			String content = request.getParameter("content");
			
			// DAO에 write 메소드 만들기
			BoardDTO dto = new BoardDTO();
			dto.setTitle(title);
			dto.setContent(content); // dto에 title, content를 담음.
			dto.setMid((String)session.getAttribute("mid")); // session은 무조건 object 처리함.
			
			
			BoardDAO dao = new BoardDAO();
			int result = dao.write(dto); // 위에서 dto에 담은 두개를 dto로 모두 던짐.
			System.out.println("글쓰기 결과는 : " + result);
			
			// 페이지 이동하기 = url값과 화면 모두 이동하기 (디스패쳐는 url은 그대로고 화면만 바뀜)
			if(result == 1) {
				response.sendRedirect("./board"); // 글쓰기 정상작동이면 board로 이동
			} else {
				response.sendRedirect("./error.jsp");
		}
		
		
		}
	}

}
반응형

댓글