Session

Let's Just Go·2022년 5월 19일
0

JSP

목록 보기
4/12

JSP

SESSION

  • Session

    • 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단 (http 통신 데이터 유지)

    • 쿠키와 다르게 클라이언트의 특정 위치에 저장되는 것이 아니라 서버 상에 객체 형태로 존재

    • 서버 당 하나의 세션 객체를 가질 수 있음 (브라우저 별 서로 다른 세션 사용)

    • 세션 객체는 브라우저 창을 종료하면 삭제

    • session.setAttribute(이름, Object value);

      • Object는 모든 객체의 부모 클래스이므로 다형성을 통해 모든 객체를 다 받을 수 있음

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%-- 
      		- 세션은 쿠키와 마찬가지로 http 통신 데이터를 유지하기 위한 수단으로 사용 
      		- 세션에 데이터를 저장할 때는 jsp 내장 객체 session이 지원하는 
      		  setAttribute() 메서드를 사용 
      		- 해당 메서드의 첫번째 매개값으로 세션의 이름을 정하고, 두번째로 세션에 저장할 값을 지정
      		 --%>
      		 
      		 <%
      		 	session.setAttribute("nickname", "홍길동");
      		 	session.setAttribute("hobbies", new String[] {"축구", "독서", "게임"});
      		 	// session의 setAttribute에서 value는 Object로 지정되어 있으므로 모든 객체 대입 가능
      
      		 %>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      	<a href="session_check.jsp">세션 데이터 확인</a>
      </body>
      </html>

      <%@page import="java.util.Arrays"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%
      		/*
      		- 세션에 저장한 데이터는 브라우저 창이 종료될 때 까지 혹은 세션의 유효시간이 
      		만료되기 전까지 웹 어플리케이션의 모든 jsp파일에서 사용 가능
      		
      		- 세션에 저장된 데이터를 가져오려면 session 객체의 메서드 getAttribute()를 사용하며
      		매개값으로 가져올 세션 데이터의 이름을 작성
      		*/
      		String nick = (String) session.getAttribute("nickname");
      		// getAttribute의 리턴 타입은 Object이기 때문에 강제 형 변환을 통해 타입을 내려서 준비한 변수에 대입
      		String[] hobbies = (String []) session.getAttribute("hobbies");
      		
      		out.print(nick+ "<br>");
      		out.print(Arrays.toString(hobbies) + "<br>");
      		out.print("-----------------------------<br>" );
      		
      		// 세션의 유효기간 설정.
      		// 세션의 수명을 따로 지정하지 않으면 기본 30분의 유효시간을 가짐
      		session.setMaxInactiveInterval(10*2); // 20초 짜리 세션
      		
      		int sTime = session.getMaxInactiveInterval();
      		// 현재 세션의 유효시간을 확인 
      		out.print("세션의 유효시간 : " + sTime + "초 <br>");
      		out.print("--------------------------------- <br> ");
      		
      	 	// 특정 세션의 데이터를 삭제(지우고 싶은 세션 이름) 
      	 	session.removeAttribute("nickname");
      		
      	 	nick = (String) session.getAttribute("nickname");
      	 	out.print("삭제 후 nick의 값 : " + nick + "<br>");
      		out.print("--------------------------------- <br> ");
      		
      		// 모든 세션 데이터를 삭제 (무효화 메소드)
      		session.invalidate();
      		hobbies = (String []) session.getAttribute("hobbies");
      		// 세션이 무효화되었으므로 (해당 페이지에서 더 이상 세션 객체를 사용할 수 없으므로) getAttribute()를 사용할 수 없음
      		// 아래의 코드는 에러가 발생 
      		// 새롭게 요청이 들어오기 전까지는 세션 객체를 사용할 수 없음
      		
      		out.print("삭제 후 hobbies의 값 : " + Arrays.toString(hobbies) + "<br>");
      		out.print("-----------------------------<br>" );
      		
      		
      	%>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      
      </body>
      </html>

  • Session login

    • session_login

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%
      		String id = (String) session.getAttribute("user_id");
      	%>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      
      	<% if (id != null ) {%>
      		<h2> <%= id %>님이 이미 로그인 중입니다~</h2>
      		<a href = "session_welcome.jsp">웰컴 페이지로~</a>
      	<%} else{ 
              // session정보가 없다는 뜻이므로 로그인을 안했다는 것을 말함
              %>
      	<form action="session_login_con.jsp" method="post">
            <input type="text" name="id" size="10" placeholder="ID"> <br>
            <input type="password" name="pw" size="10" placeholder="PW"> <br>
            <input type="text" name="nick" size="10" placeholder="별명"> <br>
            <input type="submit" value="로그인">
         </form>
      	<%} %>
      </body>
      </html>

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      
          <%
          	request.setCharacterEncoding("UTF-8");
          
          	String id = request.getParameter("id");
          	String pw = request.getParameter("pw");
          	String nick = request.getParameter("nick");
          	
          	if (id.equals("abc1234") && pw.equals("aaa1111")){
          		// 값이 같으면 세션 생성 
          		session.setAttribute("user_id", id);
          		session.setAttribute("user_nick", nick);
          		session.setMaxInactiveInterval(10);
          		response.sendRedirect("session_welcome.jsp");
      			
          	}
          	else {
      	
          %>
          
          
          	<%--
           		HTML 내부에 자바스크립트 코드를 사용하려면 <script> 태그를 사용
           		- JS내장 함수인 alert()은 브라우저에 경고창을 띄움
           		  ()안에 띄우고 싶은 문구를 작성
           		- JS내장 객체인 location.href="이동시킬URL" == sendRedirect(URL)
           		- JS내장 객체인 history가 제공하는 메서드인 back()은 뒤로가기 기능을 수행
          	--%>
          	
          	<script>
      				alert("로그인에 실패했습니다.");
      				// history.back();
      				location.href="session_login.jsp";
      				// sendRedirect()와 같은 기능 
          	
          	</script>
          			
          	
          	
          	<% session.invalidate(); } %>

    • session_welcome

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%
      		/*
      	    1. 로그인하지 않은 사용자가 주소창에 이 페이지의 URL를 직접 적고
      	    들어왔을 경우 로그인창으로 돌려보내는 코드를 작성하세요.
      	    (조건문을 사용하여 로그인 성공 시 생성되는 세션이 있는지를 확인.)
      	    
      	    2. 로그인한 회원 아이디와 별명을 통해 "nick(id)님 환영합니다!" 를
      	     출력하세요.
      	     
      	    3. a태그로 로그인창으로 돌아가는 링크와 request폴더에 앨범 선택 페이지로
      	     갈 수 있는 링크 2개를 작성하세요.
      	     
      	    4. session_login.jsp에서도 로그인 세션이 존재하는지를 확인하여 이미 로그인 중인 사용자와
      	     그렇지 않은 사용자가 서로 다른 화면을 볼 수 있도록 작성해 주세요.
      	     (로그인 성공 -> 이미 로그인 중이라는 화면, 로그인 x -> 폼)
      	    */
      	%>
      	
      	<% if (session.getAttribute("user_id") == null) {
      		response.sendRedirect("session_login.jsp");
      		// session값이 null이면 로그인을 안한거니깐 돌아가라 라는 뜻
      	}
      	else {
      		String id = (String) session.getAttribute("user_id");
      		String nick = (String) session.getAttribute("user_nick");
      		
      		// session이 있다는 것은 로그인 성공이니깐 값 가져옴 
      		%>
      
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      	<h2><%= nick %>(<%= id %>)님 환영합니다!</h2>
      	<a href="session_login.jsp">로그인창으로 돌아가기</a>
      	<a href = "/JSPBASIC/JspObjRequest/req_album_answer.jsp">앨범창</a>	
      <%} %>
      	
      
      </body>
      </html>

  • Session sign up

    • 순서

      1. 유저의 정보를 담을 수 있는 유저 객체를 생성
      2. 해당 유저들을 모두 담을 수 있는 유저 저장소 객체 생성
      3. 회원가입 시 유저의 정보를 유저 객체에 저장하고 유저 저장소에도 저장
      4. id와 pw 모두 만족하면 welcome 페이지로 이동
      5. 둘 중 하나라도 만족하지 못하면 다른 페이지로 이동하여 로그인을 유도
    • user 클래스 생성

      package user;
      
      public class User {
      	
      
      	private String account;
      	private String password;
      	private String name;
      	private String nickName;
      	// private를 통해서 외부에서 직접 접근하지 못하게 하고 User클래스의 객체 연산으로만 접근가능하도록 사용
      	
      	public User(){
      		
      	}
      	
      	
      	public User(String account, String password, String name, String nickName) {
      		super();
      		this.account = account;
      		this.password = password;
      		this.name = name;
      		this.nickName = nickName;
      	}
      	// alt+shift+s를 통해서 매개변수를 받는 생성자 생성 가능
      	// 객체를 생성하면 자동으로 해당 변수들이 초기화되도록 함 
      
      	// Getter와 Setter를 통해서 메소드를 통해 접근하여 값을 변경하도록 함(alt+shift+s)
      	// Setter에 입력값의 유효성 검증을 할 수 있음
      	public String getAccount() {
      		return account;
      	}
      	public void setAccount(String account) {
      		this.account = account;
      	}
      	public String getPassword() {
      		return password;
      	}
      	public void setPassword(String password) {
      		this.password = password;
      	}
      	public String getName() {
      		return name;
      	}
      	public void setName(String name) {
      		this.name = name;
      	}
      	public String getNickName() {
      		return nickName;
      	}
      	public void setNickName(String nickName) {
      		this.nickName = nickName;
      	}
      }

    • UserRepository 생성

      package user;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class UserRepository {
      	
      	// 회원의 정보를 담아놓을 리스트(회원 저장소)
      	private static List<User> userList = new ArrayList<>();
      	// user의 정보를 담을 수 있는 리스트 생성하면서 전역에서 사용할 수 있음
      	
      	public static void save (User u) {
      		userList.add(u);
      	}
      	// 회원저장소(List)에 회원(User)을 추가하기 위한 메소드
      	
      //	public User find (int number) {
      //		return userList.get(number);
      //	}
      //	
      //	public void delete (int number) {
      //		userList.remove(number);
      //	}
      	
      	//회원 정보 저장 후 리스트 내부를 보여주는 메서드.
         public static void showUsers() {
            System.out.println("### 회원 정보 ###");
      
            for(User user : userList) {
               System.out.println("아이디: " + user.getAccount());
               System.out.println("비밀번호: " + user.getPassword());
               System.out.println("이름: " + user.getName());
               System.out.println("별명: " + user.getNickName());
               System.out.println("===============================");
            }
         }
         
         // 매개값으로 id를 받아서 해당 id를 가진 객체가 userList에 있는지 탐색 
         public static User getUser(String id) {
      	   User finduser = null;
      	   for (int i = 0; i<userList.size(); i++) {
      		   if (userList.get(i).getAccount().equals(id)) {
      			   //userList에 같은 id가 있으면 
      			   	finduser = userList.get(i);
      		   }
      
      	   }
      	   return finduser;
         }
      }

    • register_form

    • 값을 받아서 화면에 출력하기 위한 양식

      <%@ page language="java" contentType="text/html; charset=UTF-8"
      	pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>register_form</title>
      </head>
      <body>
      	<h2>회원 가입 양식</h2>
      
      	<form action="register_controller.jsp" method="post">
      		<p>
      			<input type="text" name="account" placeholder="ID" required>
      			<br> <input type="password" name="password" placeholder="PW">
      			<br> <input type="text" name="name" placeholder="이름"> <br>
      			<input type="text" name="nickname" placeholder="별명"> <br>
      			<input type="submit" value="회원가입">
      		</p>
      	</form>
      
      </body>
      </html>

    • register_controller

    • 값들을 받아서 받은 값을 다른 곳에 전달

      <%@page import="user.User"%>
      <%@page import="user.UserRepository"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      
          
          <%
          	request.setCharacterEncoding("UTF-8");
          	
          	// 값 가져오기
          	String id = request.getParameter("account");
          	String pw = request.getParameter("password");
          	String name = request.getParameter("name");
          	String nick = request.getParameter("nickname");
          		
          	
      		User user = new User(id, pw, name, nick);
      		// getparamter를 통해서 받은 값을 User객체에 바로 전달(변수 초기화)
      		UserRepository.save(user);
      		// 유저리스트에 static 메소드인 save를 활용하여 User객체 넣기 
      		// static 메소드는 객체 생성 X
      		
      		UserRepository.showUsers();
      		
      		response.sendRedirect("register_result.jsp");
      		
      		
          %>

    • register_result

      <%@ 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>회원 가입 성공 </h2>
      <a href = "login_form.jsp">로그인 페이지로</a>
      <a href = "register_form.jsp">회원가입 페이지로</a>
      </body>
      </html>

    • login_form

      <%@ 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>
      	<form action="login_controller.jsp" method="post">
      	<!-- login_controller.jsp로 전송 -->
      		<input type="text" name="account" placeholder="아이디"> <br>
      		<input type="password" name="password" placeholder="비밀번호"> <br>
      		<input type="submit" value="로그인">
      		<button type="button" onclick="location.href='register_form.jsp'">회원가입</button>
      		<%--
                  onclick 속성을 사용하면 해당 태그가 클릭 되었을 시에 동작할
                  자바스크립트 문법을 작성할 수 있습니다.
                  자바스크립트는 문자열을 "", '' 둘 다 인정합니다.
                --%>
      	</form>
      
      </body>
      </html>

    • login_controller

      <%@page import="user.UserRepository"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
      	pageEncoding="UTF-8"%>
      
      <%
          /*
          1. 입력된 회원 정보를 가져오세요.
          
          2. 로그인을 시도하는 회원의 모든 정보를 얻어오세요. (getUser())
          getUser() -> 아이디를 전달받아 해당 아이디와 일치하는 객체가 있는지
          확인 후, 있다면 그 객체를 리턴.
          일치하는 객체가 없다면 null을 리턴.
          
          3. 조건문을 사용하여 getUser()의 리턴값이 null인지 아닌지를 확인하여
           null값을 받았다면 회원가입이 되어있지 않은 사람이 로그인을 시도한 것이므로
            로그인 페이지로 보내주세요. (script로 경고창 띄운 후 로그인 페이지로. (location.href=""))
            
          4. getUser()의 리턴값이 null이 아닌 경우
          회원 가입 당시에 작성했던 비밀번호가 로그인할 때 작성한 비밀번호와
          일치하는지를 확인하여 같다면 세션에 로그인 데이터를 저장해 주세요.
          ("login", User객체)
          
          5. 세션을 만든 후 "login_welcome.jsp"로 페이지를 이동시켜 주세요.
          
          6. 비밀번호가 일치하지 않는다면 script태그로 "비밀번호가 일치하지 않습니다."
           경고창 하나 띄워 주시고 다시 로그인 페이지로 이동시켜 주세요.
          */
          %>
          
          <%
          String id = request.getParameter("account");
          String pw = request.getParameter("password");
          String name = request.getParameter("name");
          String nickname = request.getParameter("nickname");
          
          if (UserRepository.getUser(id) != null) {
          	if (UserRepository.getUser(id).getPassword().equals(pw)){
          		session.setAttribute("login",UserRepository.getUser(id));
          		response.sendRedirect("login_welcome.jsp");
          	}
          	else { %>
          	<script>
      				alert("비밀번호가 일치하지 않습니다.");
      				// history.back();
      				location.href="login_form.jsp";
      				// sendRedirect()와 같은 기능 
          	
          	</script>
          		
          	<%}
          }
          else{%>
          	 <script>
      				alert("로그인에 실패했습니다.");
      				// history.back();
      				location.href="login_form.jsp";
      				// sendRedirect()와 같은 기능 
          	
          	</script>
          <%}
          %>

    • login_welcome

      <%@page import="user.User"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%
      		User u = (User) session.getAttribute("login");
      	%>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      <h2> <%= u.getName() %>님 로그인을 환영합니다!</h2>
      <h3> 당신의 닉네임은 <%= u.getNickName() %>입니다.</h3>
      
      </body>
      </html>
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글