다연이네

[days07] 세션을 사용해서 로그인 처리(상태 관리)(회원/비회원/관리자) 본문

JSP

[days07] 세션을 사용해서 로그인 처리(상태 관리)(회원/비회원/관리자)

 다연  2021. 1. 4. 20:13
반응형

[ 세션을 사용해서 로그인 처리(상태 관리) ]

쿠키를 사용했을 때와 똑같은 코딩을 세션으로 바꿔보기!!

 

  1. ex06_default .jsp
   메인 페이지
   로그인 + 로그아웃
   id/passwd
  
  2. ex06_logon.jsp
   입력받은 id/password 인증 처리
   - 로그인 성공 : auth 쿠키이름으로 id 저장
   - 로그인 실패 : ex06_default.jsp?error (메인 페이지) 이동


  3. ex06_board .jsp 게시판 관련 페이지
   - 로그인 하지 않은 사용자라면 게시글 목록 보기 (권한부여)
   - 로그인 인증 + 일반 사용자 : 글쓰기 (권한부여)
   + 관리자   : 글쓰기, 수정, 삭제 (권한부여)


  4. ex06_logout.jsp
   - 로그아웃 버튼을 클릭할 때 auth 쿠키 삭제 
   - ex06_default.jsp 메인 페이지로 이동

 

 

 

  1.저장 - 로그인 id/passwd  session.setAttribute("")
  2. 가져오기 - session.getAttribute("auth")
     EL로 가져오기 - sessionScope.auth
  3. 로그아웃
      session.invalidate()
  4. 서블릿 session 객체를 사용하는 방법
      HttpSession session = reqquest.getSession(true/false);
      -차이점-
      false null 반환
      true  새로운 세션 객체를 생성해 반환

 

 

ex06.default.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@include file="ex06_auth.jspf" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
 div{
   border: 1px solid gray;
   width: 300px;
   height: 100px;
   padding: 20px;
 }
</style>
<script>
   $(document).ready(function (){     
	   $("#logon span").fadeOut(5000);
   });
</script>
</head>
<body>
 <h3>default(main) page</h3>
 
 
 <%
   if(auth==null){
%>

 <div id="logon">
   <form action="ex06_logon.jsp">
     아이디: <input type="text" name="id" value="admin" /><br>
     비밀번호: <input type="password" name="passwd" value="1234"  /><br>
     <input type="submit" value="로그인" />
     <input type="button" value="회원가입" />
     <br>
     <%
     //?error 달려있다면
    String error = request.getParameter("error");
    if(error != null){
    %>
    <span style="color: red">로그인 실패했습니다.</span>
    <%
    }
     %>
   </form>
 </div>
<%	   
   }else{
%>
 <div id="logout">
 [<%=auth %>]님 환영합니다.<br>
 <a href="ex06_logout.jsp">로그아웃</a>
 </div>
<%
   }
 %>
 
 <!-- 인증, 권한 따라 사용할 메뉴 처리 -->
<!--  게시판과 공지사항은 인증/권한 없이 사용 가능 -->
 <a href="ex06_board.jsp">게시판</a><br>
 <a href="ex06_notice.jsp">공지사항</a><br>
 
 <%
   if(auth!=null){ //로그인 되어졌음 (인증O)
%>
   <a href="#">일정관리</a><br>
   <a href="#">자료실</a><br>
<%
     if(auth.equals("관리자")){
    %>
       <a href="#">사원관리-(관리자 권한)</a><br>
       <a href="#">급여관리-(관리자 권한)</a><br>
    <%
     }
   }
 %>
</body>
</html>

위 코딩을 jstl로 바꾸자 ( <c:if~ )

 - 가독성 상승

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@include file="ex06_auth.jspf" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
 div{
   border: 1px solid gray;
   width: 300px;
   height: 100px;
   padding: 20px;
 }
</style>
<script>
   $(document).ready(function (){     
	   $("#logon span").fadeOut(5000);
   });
</script>
</head>
<body>
 <h3>default(main) page</h3>
 
 
 
<c:if test="${empty auth }">
<div id="logon">
   <form action="ex06_logon.jsp">
     아이디: <input type="text" name="id" value="admin" /><br>
     비밀번호: <input type="password" name="passwd" value="1234"  /><br>
     <input type="submit" value="로그인" />
     <input type="button" value="회원가입" />
     <br>
     
     <!-- EL empty 연산자 null, '' 모두 true -->
    <!--  ?error -->
     <c:if test="${param.error  eq ''}">
     <span style="color: red">로그인 실패했습니다.</span>
     </c:if>
      </form>
 </div>
</c:if>
 <c:if test="${not empty auth }">
 <div id="logout">
 [<%=auth %>]님 환영합니다.<br>
 <a href="ex06_logout.jsp">로그아웃</a>
 </div>
 </c:if>


 
 <!-- 인증, 권한 따라 사용할 메뉴 처리 -->
<!--  게시판과 공지사항은 인증/권한 없이 사용 가능 -->
 <a href="ex06_board.jsp">게시판</a><br>
 <a href="ex06_notice.jsp">공지사항</a><br>
 

<c:if test="${not empty auth }">
  <a href="#">일정관리</a><br>
   <a href="#">자료실</a><br>
   <c:if test='${auth eq "관리자" }'>
      <a href="#">사원관리-(관리자 권한)</a><br>
      <a href="#">급여관리-(관리자 권한)</a><br>
   </c:if>
</c:if>

 

</body>
</html>

ex06_logon.jsp

<%@page import="java.util.HashMap"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

   //member 컬렉션
   HashMap<String, String> member = new HashMap<>();
   member.put("admin","1234"); //관리자 권한
   member.put("hong","1234");   //일반 권한
   member.put("park","1234");    //일반 권한
   
   //위가 db라고 가정 (시간관계상)
   String id = request.getParameter("id");
   String passwd = request.getParameter("passwd"); 
   
   if(id.equals("admin")&&passwd.equals("1234")){
	   session.setAttribute("auth", "관리자");
	   response.sendRedirect("ex06_default_el_jstl.jsp");
   }else if(id.equals("hong")&&passwd.equals("1234")){
	   session.setAttribute("auth", id);
	   response.sendRedirect("ex06_default_el_jstl.jsp");
   }else if(id.equals("park")&&passwd.equals("1234")){
	   session.setAttribute("auth", id);
	   response.sendRedirect("ex06_default_el_jstl.jsp");
   }else{
	   response.sendRedirect("ex06_default_el_jstl.jsp?error");
   }
   
%>

ex06_auth.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
  //auth.jspf
  String auth = null;
  String name= "auth"; 
  // "auth"란 속성명으로 세션에 저장된 값을 읽어와서 auth 변수에 저장
  auth = (String)session.getAttribute(name);
%>

ex06_logout.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@include file="ex06_auth.jspf" %>
<%
//세션 객체 제거하면서 모든 세션에 저장된 속성들도 제거
 session.invalidate();
%>
<script>
  alert("[<%=auth%>]님 로그아웃 되었습니다.");
  location.href="ex06_default_el_jstl.jsp";
</script>

ex06_board.jsp

<%@page import="com.util.Cookies"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@include file="ex06_auth.jspf" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
   $(document).ready(function (){     
   });
</script>
</head>
<body>
<a href="ex06_default_el_jstl.jsp">Home</a>
<br />
<a href="ex06_list.jsp">글목록</a>
<!-- 
글쓰기 - 일반 권한, 관리자 권한
글수정, 삭제 - 관리자 권한
 -->
 <c:if test="${not empty auth }">
  <a href="#">글쓰기</a>
  
  <c:if test='${auth eq "관리자" }'>
     <a href="#">글수정</a>
     <a href="#">글삭제</a>
  </c:if>
 </c:if>

</body>
</html>

 

 

 

 


로그인 정보를 세션에 저장한다면 금방처럼 로그인ID 만을 auth 속성명으로 하나만 저장할 일은 잘 없다.
나중에 저장하더라도 로그인한 계정에 여러가지 정보(계정명, 권한, 기타 등등)를 저장하는 일을 앞으로 많이 할 것이다.

<%
session.setAttribute("name", value);
session.setAttribute("authenticate", value);
session.setAttribute("age", value);
session.setAttribute("tel", value);
session.setAttribute("address", value);
%>

위처럼 하나 하나 하지 않고 객체로 저장할 것

<%
  EmpDTO dto = new EmpDTO(7566,"SMITH","Manager",8977, null, 800,0,10);
  session.setAttribute("user", dto);
  //프로젝트 - 장바구니 이렇게 객체로 
%>

사용할때는

<%
EmpDTO user = (EmpDTO)session.getAttribute("user");
%>
로그인 사원명 : <%=user.getEname() %><br>
로그인 사원번호 : <%=user.getEmpno() %><br>

 

 

 

<body>

<%   
  /*
  session.setAttribute("name", value);
  session.setAttribute("authenticate", value);
  session.setAttribute("age", value);
  session.setAttribute("tel", value);
  session.setAttribute("address", value);
  */
 
  EmpDTO dto = new EmpDTO(7566,"SMITH","Manager",8977, null, 800,0,10);
  session.setAttribute("user", dto);
%>
<!-- 사용할때는 -->
<%
EmpDTO user = (EmpDTO)session.getAttribute("user");
%>
로그인 사원명 : <%=user.getEname() %><br>
로그인 사원번호 : <%=user.getEmpno() %><br>

</body>

 

<%
	//세션 객체를 제거 (여러 속성도 모두 삭제)
	session.invalidate();

	//user 속성만 제거
	session.removeAttribute("user");
%>

 

반응형
Comments