JAVA

로그인아웃, session

docc 2021. 7. 26. 12:46

로그인

앞으로 jsp 의 <%@ %>: 디렉티브태그에 session="false" 를 넣자.

이 의미는 내가 만들기 전까지 session이 자동으로 만들어지는걸 방지하는 것이다.

>> 로그인준비.java

public class 로그인준비 implements IControl{

	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
		
		ModelAndView mv = new ModelAndView();
		
		mv.addObject("key", "value");
		mv.setViewName("로그인창");
		
		return mv;
	}

}

>> 로그인창.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>로그인</h1>
<p>${msg}</p>
<form action="login.do" method="post" onsubmit="return 필수입력()">
id <input type="text" id="id" name="id"/>
password <input type="password" id="password" name="password"/>
<input type="submit" value="로그인"/>
</form>
</body>
</html>
<script>
	function 필수입력(){
		var id = document.querySelector("#id").value;
		var password = document.querySelector("#password").value;
		
		if(id==null || id==""){
			alert("아이디를 입력하세요");
			return false;
		}
		if(password==null || password==""){
			alert("비밀번호를 입력하세요");
			return false;
		}
		
		return true;
	}
</script>

>> 로그인.java (MemberDAO 의 isin() 메서드 수정함// 밑에서 확인)

public class 로그인 implements IControl{

	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
		//요청
		String id = request.getParameter("id");
		String password = request.getParameter("password");
		MemberDAO dao = new MemberDAO();
		
		Object[] NoAndName = dao.isin(id, password);
		
		ModelAndView mv = new ModelAndView();
		if(NoAndName==null) {
			//여기서 조건을 따져 forward 로 보내며 msg 까지 설정하면 로그인준비 control 에서 다시 조건을 따져 request 로 값을 받고 view 넘기지 않아도
			//이 값들이 request에 누적되어 view까지 넘어간다.
			mv.addObject("msg", "id 또는 비밀번호가 일치하지 않습니다.");
			mv.setViewName("forward:/prepare_login.do");
			return mv;
		}
		
		// 로그인할 때만 session 을 만들고 로그인했으니 회원번호를 session에 저장하여 앞으로 나올 페이지들을 회원껄로 바꿔야한다.
		HttpSession session = request.getSession();
		session.setAttribute("no", NoAndName[0]);	// 회원 번호 저장.
		session.setAttribute("name", NoAndName[1]);	// 회원 번호 저장.
		session.setMaxInactiveInterval(60*30); 	// s(초) 단위. session이 존재하는 시간. 즉, 로그인 유지시간이다. web.xml 에서도 지정가능하며 거기는 분단위다.
		mv.setViewName("로그인성공");//아직없는창
		
		return mv;
	}

}

>> MemberDAO.java ( name 만 나왔는데 이제 no, name 두개를 Object[] 에 담아서 나온다.)

	public Object[] isin(String id, String password) {
		
		Object[] NoAndName = null;
		
		try {
			Connection c = ConnectionUtil.getConnection();
			PreparedStatement pre = c.prepareStatement("select no,name from member where id = ? and password = ?");
			pre.setString(1, id);
			pre.setString(2, password);
			ResultSet set = pre.executeQuery();
			
			if(set.next()) {
				int no = set.getInt("no");
				String name = set.getNString("name");
				NoAndName = new Object[2];
				NoAndName[0] = no;
				NoAndName[1] = name;
			}
			
			set.close();
			pre.close();
			c.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return NoAndName;
	}

>> 로그인성공.jsp

<body>
${name} 님 환영합니다.
<a href="contents.do">내용</a>
</body>

>> 내용보이기.java

public class 내용보이기 implements IControl {

	@Override
	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.setViewName("내용창");
		return mv;
	}

>> 내용창.jsp

<body>
<jsp:include page="로그인상단.jsp"/>
<p>
Acknowledgements
To the Student
To the Teacher
</body>

>> 로그인상단.jsp

상단에서 먼저 session 이 null 이 아니지만 다른 값이고 로그인시 name 이 저장되어야 하는데 null인 경우 session을 null로 바꾼다.

그리고 하단에서 로그인여부(session존재여부) 를 따져 나올 내용을 정한다.

<%
   HttpSession session= request.getSession(false);
   if(session!=null&& session.getAttribute("name")==null){session=null;}
%>
<!DOCTYPE html>
<html>
<head>
<style>

</style>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<% if(session!=null){  %>
  <%=(String)session.getAttribute("name") %><img src="img/logined.png"/><button onclick="location.href='logout.do'">로그아웃</button>
<%}else{ %>
   <button onclick="location.href='prepare_login.do'">로그인</button>
<%} %>
</body>

로그아웃

>> 로그아웃.java

	@Override
	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
		
		HttpSession session = request.getSession(false);
		if(session != null) {
			session.invalidate();
		}
		
		ModelAndView mv = new ModelAndView();
		
		mv.setViewName("forward:/contents.do");
		return mv;
	}

Session

: 로그인, 로그아웃 시 필요

HttpSession session= request.getSession(false);
if(session!=null&& session.getAttribute("name")==null){session=null;}
session을 통해 로그인 여부 확인하기
(로그인시 session을 생성하고 또는 이미존재하는걸 가져오고, 회원의 이름을 저장해놓은 상태다)
1. getSession(false) : session 이 없다면 null 로 설정하고 한다.
session에 값이 있는지 확인하기위해 가져오기는 해야하니 getSession(false) 로 가져와 없으면 메서드의 매개변수(false)를 사용해
null 로 만든다.
(if문을 수행하지 않아도 null이다.)
2. 만약 존재한다면 그 session 에 회원이 로그인 했을 시 있을 회원이름이 존재하는지 확인한다.
만약 없고 null 이라면 session 을 null 로 바꿔 앞으로 로그인 여부확인 시 로그아웃상태임을 알린다.
session.invalidate() 
// session 값들 초기화
로그아웃 시 session 을 없애기
invalidate() 라는 메서드로 session 을 없앤다.