Programming/JSP

[JSP] Session / Cookie (로그인, 로그아웃 폼 만들기)

너굴위 2023. 10. 12. 18:34
728x90
반응형

JSP 기본 객체와 영역

  • PAGE 영역 : 하나의 JSP 페이지를 처리할 때 사용되는 영역
  • REQUEST 영역: 하나의 HTTP요청을 처리할 때 사용되는 영역
  • SESSION 영역: 하나의 브라우저에서 접속하는 모든 페이지에 존재 (request보다 더 오래 남아있음)                                                     - 같은 JSP페이지라도 웹 브라우저에 따라 서로 다른 세션을 사용한다.
  • APPLICATION 영역 : 톰켓에서 실행되는 모든 영역

PAGE / REQUEST

 

=> setAttribute (String name, Object value) : 이름이 name인 속성의 값을 value로 지정

=> getAttribute (String name) : 이름이 name인 속성의 값을 구함(가져온다).

                                                  지정한 이름의 속성이 존재하지 않으면 null을 리턴

// setAttribute / getAttribute 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	String data1 ="value1";
	out.println("data1: "+ data1 + "<br />");
	
	//기본객체
	//해당 페이지에서만 값이 생성되고 다른 페이지에서 사용할 수 없다.
	pageContext.setAttribute("data2","value2");     
	String data2 = (String)pageContext.getAttribute("data2");         //원래 인자인 Object자리에 String을 넣기 위해 String으로 형변환 시켜준다.
	out.println("data2: "+ data2 + "<br />");
	
	
	//setAttribute안에 객체 형태로 넣을 수 있음
	pageContext.setAttribute("data3",new java.util.Date());    
	java.util.Date date =(java.util.Date)pageContext.getAttribute("data3");
	out.println("data3: "+ date + "<br />");

	
%>

 

//request.jsp

<%@ 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>
<!-- request 영역 -->
<!-- request 영역은 하나의 요청을 처리하는 데 사용되는 모든 JSP페이지를 포함 -->

<form action="./request1_ok.jsp" method="post">
데이터1<input type="text" name="data1" value="value1"/>
<input type="submit" value="전송하기"/>
</form>

<br />

<form action="./request2_ok.jsp" method="post">
데이터1<input type="text" name="data1" value="value1"/>
<input type="submit" value="전송하기"/>
</form>

</body>
</html>

 

//request1_ok.jsp

<%@ 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>
<!-- request1_ok.jsp -->
<%
   pageContext.setAttribute("data2", "value1") ;
   out.println("data2 : "
         + (String)pageContext.getAttribute("data2") + "<br/>") ;
   out.println(pageContext + "<br />") ;
%>
<br /> <hr /> <br />
<%
   String data1 = request.getParameter("data1") ;
   out.println("data1 : " + data1 + "<br />") ;
   out.println( request + "<br />" ) ;
%>
<br /><hr /><br />


<%
	//request의 공유로 페이지 간 값을 넘길 수 있다.
	request.setAttribute("data4", "value4");
%>

<jsp:include page="request1_sub.jsp">
<jsp:param value="value3" name="data3"/>
</jsp:include>

</body>
</html>

 

//request2_ok.jsp

<%@ 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>
<!-- request2_ok.jsp -->

<%
   pageContext.setAttribute("data2", "value1") ;
   out.println("data2 : "
         + (String)pageContext.getAttribute("data2") + "<br/>") ;
   out.println(pageContext + "<br />") ;
%>
<br /> <hr /> <br />
<%
   String data1 = request.getParameter("data1") ;
   out.println("data1 : " + data1 + "<br />") ;
   out.println( request + "<br />" ) ;
%>
</body>
</html>

 

// request1_sub.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
Hello request1_sub.jsp<br />

<br /> <hr /><br />
<%
	String data1 = request.getParameter("data1");
	out.println("data1: "+data1+"<br />");
	out.println(request+"<br />");
	
	out.println("data3:"+request.getParameter("data3")+"<br />");
	out.println("data4:"+(String)request.getAttribute("data4")+"<br />");

%>

 

<jsp:include page="request1_sub.jsp">

<jsp:param value="value3" name="data3"/>

</jsp:include>

request1_sub페이지에 파라미터로 value3값 넘기기

SESSION

- 서버에 세션을 저장

- 로그인한 사용자의 정보저장

   <%@ page session ="true %>  를 통해 세션을 생성

- 세션의 유효시간 지정 => 세션이 계속 쌓이게 되면 메모리 부족현상 발생

- 같은 세션을 공유하는 JSP페이지는 같은 값 사용가능

 

//session01.jsp

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%-- <%@ page session="false" %>  --%><!-- false로 세션을 생성을 하지 않을 수 있음 -->
<%

	//세션의 고유 아이디
	out.println("세션 아이디:"+ session.getId() +"<br />");
	//세션이 생성된 시간:ms단위
	out.println("유효 시간:"+ session.getMaxInactiveInterval() +"<br />");
	
	//생성 시간 (서버가 종료되는 시점)
	Date date = new Date();
	date.setTime(session.getCreationTime());
	out.println("생성 시간:"+ date.toLocaleString() +"<br />");

	//최근 접속 시간
	out.println("접속 시간: "+session.getLastAccessedTime()+"<br />");
	date.setTime(session.getLastAccessedTime());
	out.println("접속 시간: "+date.toLocaleString()+"<br />");
	
	
%>

 

//session02.jsp

<%@ 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>
<!-- session02.jsp -->
<%
	session.setAttribute("data1", "value1");
%>
세션 입력
</body>
</html>

 

//session03.jsp

<%@ 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>
<!-- session03.jsp -->

<%
	out.println("세션 :"+session.getAttribute("data1"));
%>
</body>
</html>

 


Session으로 로그인 /로그아웃 만들기

회원 로그인 구조

- 회원 정보입력(로그인 폼:login_form.jsp)

    -> 로그인 확인:login_ok.jsp  (실제로 보이지 않고 확인하는 페이지)

               -> 성공   -> 로그인된 페이지 ( : login_complete.jsp)

                                  (직접접근)

                                  => 세션 검사

                                  -> 성공 (페이지 접근)

                                  -> 실패 (로그인 폼) 

                                  

                                  -> 로그아웃 : logout_ok.jsp (로그아웃 처리만을 위한 페이지)

                 

               -> 실패

                        -> 로그인 폼

 

 

암호는 암호화...비가역적

1. java 암호화 -> DB

2. java -> DB 암호화

                 가역적   reversible

                 비가역적  irreversible

 

단순화 암호화 기법

password

 

회원 테이블

create table member1 (

seq int not null primary key auto_increment,

id varchar(12) not null,

password varchar(50) not null,

name varchar(12) not null,

mail varchar(50),

grade char(1) not null,

wdate datetime not null

);

 

> insert into member1 values(0,'tester',password('1234'),'이름','test@test.com','A',now());

 

 

아이디 암호 존재확인을 위한 select문

* 암호 또는 개인정보는 select 하면 안됨

PreparedStatement

select name, mail, grade from member1 where id=? and password= ?

 

name , mail, grade => 세션에 입력될 내용들

 

//login_form.jsp

<%@ 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>
<!-- login_form.jsp -->
<form action="./login_ok.jsp" method="post">
아이디<input type="text" name="id" />
패스워드 <input type="password" name="password" />
<input type ="submit" value="로그인" />
</form>

</body>
</html>

 

//login_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.PreparedStatement"%>
<%@ page import="java.sql.ResultSet"%>
<!-- login_ok.jsp -->
<%

	request.setCharacterEncoding("utf-8");


	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	
	String name="";
	String mail="";
	String grade="";
	
	
	Connection conn=null;
	PreparedStatement pstmt =null;
	ResultSet rs = null;
	// 저장된 아이디와 패스워드
	String save_id ="tester";
	String save_password="1234";
	
	
	try{
		Context initCtx = new InitialContext();
		Context envCtx =(Context)initCtx.lookup("java:comp/env");
		DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb3");
		conn = dataSource.getConnection();
		String sql = "select name, mail, grade from member1 where id=? and password= password(?)";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1,id);
		pstmt.setString(2,password);
		rs=pstmt.executeQuery();
		
		if(rs.next()){
			name= rs.getString("name");
			mail =rs.getString("mail");
			grade=rs.getString("grade");
			
		}
	}catch(SQLException e){
		System.out.println( "[에러] " + e.getMessage() );
	} finally{
		if(rs!=null)pstmt.close();
		if(pstmt!=null)pstmt.close();
		if(conn!=null)conn.close();
	}
	
	
	
	//flag
	// 0 - 로그인
	// 1 - 아이디 / 비밀번호 오류
	// 2 - 기타 오류
	
	int flag =2;
	
	if(save_id.equals(id) && save_password.equals(password)) {
		// 성공
		flag=0;
		
		//세션에 넣어지는 값은 - 개인정보(X)
		//로그인 성공 시 id와 grade값을 세션에 넣어 로그인 성공 여부에 대한 정보를 확인할 수 있도록 함  = complete페이지를 직접 접근 하지 못하도록 함
		session.setAttribute("sid", id);
		session.setAttribute("sgrade",grade);   
		session.setAttribute("name", name);
		session.setAttribute("mail", mail);
		
	}else{
		// 실패
		flag=1;
	}
	
	//리다이렉션
	out.println("<script type='text/javascript'>");
	if(flag==0){
		out.println("alert('로그인 되었습니다');");
		out.println("location.href='login_complete.jsp';");
	}else if(flag ==1){
		out.println("alert('아이디/비밀번호 오류');");
		out.println("history.back();");
	}else{
		out.println("alert('시스템 오류');");
		out.println("history.back();");
	}
	out.println("</script>");
	
%>

 

//login_complete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	//만약 해당 세션에 sid와 sgrade가 존재하지 않는다면(= 로그인 폼 경로로 들어온 것이 아닌 직접적으로 접근했을 때)
    if(session.getAttribute("sid")==null||session.getAttribute("sgrade")==null){
    	// 로그인 안함
    	//리다이렉션
    	out.println("<script type='text/javascript'>");
    	out.println("alert('로그인 해야합니다.');");
    	out.println("location.href='login_form.jsp';");
    	out.println("</script>");
    }else{
    	//로그인 함
    	
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- login_complete.jsp -->
로그인 후 보여질 페이지 <br />
세션 아이디: <%=(String)session.getAttribute("sid") %> <br/>
세션 그래이드: <%=(String)session.getAttribute("sgrade") %> <br/>
사용자 이름: <%=(String)session.getAttribute("name") %> <br/>
사용자 이메일 : <%=(String)session.getAttribute("mail") %> <br/>


<br /><br />
<a href="logout_ok.jsp">로그아웃</a>
</body>
</html>
<%
}
%>

 

//logout_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	session.invalidate();

out.println("<script type='text/javascript'>");
out.println("alert('로그아웃 되었습니다.');");
out.println("location.href='login_form.jsp';");
out.println("</script>");
%>

Cookie

- Cookie 클래스 사용

  Cookie cookie = new Cookie("cookieName", cookieValue");

- 유효시간을 설정하여 웹 브라우저가 쿠키를 얼마동안 보관할지를 지정할 수 있다.

개발자도구에서 cookie 확인하기


Cookie를 이용한 로그인 / 로그아웃 구현하기

 

util패키지 밑에 Cookies.java생성해주어야 한다.

//Cookies.java


package util;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

public class Cookies {
	private Map<String, Cookie> cookieMap = new java.util.HashMap<String, Cookie>();
	
	public Cookies(HttpServletRequest request) {
		Cookie[] cookies = request.getCookies();
		if(cookies != null) {
			for(int i=0;i<cookies.length;i++) {
				cookieMap.put(cookies[i].getName(), cookies[i]);
			}
		}
	}
	
	public Cookie getCookie(String name) {
		return cookieMap.get(name);
	}
	
	
	public String getValue(String name) throws IOException{
		Cookie cookie = cookieMap.get(name);
		if(cookie==null) {
			return null;
		}
		return URLDecoder.decode(cookie.getValue(),"utf-8");
	}
	
	public boolean exists(String name) {
		return cookieMap.get(name)!=null;
	}
	
	public static Cookie createCookie(String name, String value) throws IOException{
		return new Cookie(name, URLEncoder.encode(value,"utf-8"));
	}
	
	public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException{
		Cookie cookie = new Cookie(name,URLEncoder.encode(value,"utf-8"));
		cookie.setPath(path);
		cookie.setMaxAge(maxAge);
		return cookie;
	}
	
	
	public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException{
		Cookie cookie = new Cookie(name,URLEncoder.encode(value,"utf-8"));
		cookie.setDomain(domain);
		cookie.setPath(path);
		cookie.setMaxAge(maxAge);
		return cookie;
	}
	
	
}

 

//login_form.jsp

<%@ 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>
<!-- login_form.jsp -->
<form action="./login_ok.jsp" method="post">
아이디<input type="text" name="id" />
패스워드 <input type="password" name="password" />
<input type ="submit" value="로그인" />
</form>

</body>
</html>

 

//login_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.PreparedStatement"%>
<%@ page import="java.sql.ResultSet"%>
<!-- login_ok.jsp -->
<%@ page import="util.Cookies" %>

<%

	request.setCharacterEncoding("utf-8");


	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	
	String name="";
	String mail="";
	String grade="";
	
	
	Connection conn=null;
	PreparedStatement pstmt =null;
	ResultSet rs = null;
	// 저장된 아이디와 패스워드
	String save_id ="tester";
	String save_password="1234";
	
	int flag =2;
	try{
		Context initCtx = new InitialContext();
		Context envCtx =(Context)initCtx.lookup("java:comp/env");
		DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb3");
		conn = dataSource.getConnection();
		String sql = "select name, mail, grade from member1 where id=? and password=password(?)";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1,id);
		pstmt.setString(2,password);
		rs=pstmt.executeQuery();
		
		if(rs.next()!=false){
			name= rs.getString("name");
			mail =rs.getString("mail");
			grade=rs.getString("grade");
			flag=0;
			
			response.addCookie(Cookies.createCookie("cid", id));
			response.addCookie(Cookies.createCookie("cgroup", grade));
			response.addCookie(Cookies.createCookie("name", name));
			response.addCookie(Cookies.createCookie("mail", mail));
			
		}else{
			// 실패
			flag=1;
		}
	}catch(SQLException e){
		System.out.println( "[에러] " + e.getMessage() );
	} finally{
		if(rs!=null)pstmt.close();
		if(pstmt!=null)pstmt.close();
		if(conn!=null)conn.close();
	}
	
	
	
	//flag
	// 0 - 로그인
	// 1 - 아이디 / 비밀번호 오류
	// 2 - 기타 오류
	
	
	
	/*if(save_id.equals(id) && save_password.equals(password)) {
		// 성공
		flag=0;
		
		response.addCookie(Cookies.createCookie("cid", id));
		response.addCookie(Cookies.createCookie("cgroup", "B"));
		response.addCookie(Cookies.createCookie("name", name));
		response.addCookie(Cookies.createCookie("mail", mail));
		//세션에 넣어지는 값은 - 개인정보(X)
		//로그인 성공 시 id와 grade값을 세션에 넣어 로그인 성공 여부에 대한 정보를 확인할 수 있도록 함  = complete페이지를 직접 접근 하지 못하도록 함
		//session.setAttribute("sid", id);
		//session.setAttribute("sgrade",grade);   
		//session.setAttribute("name", name);
		//session.setAttribute("mail", mail);
		
	}else{
		// 실패
		flag=1;
	}
	*/
	//리다이렉션
	out.println("<script type='text/javascript'>");
	if(flag==0){
		out.println("alert('로그인 되었습니다');");
		out.println("location.href='login_complete.jsp';");
	}else if(flag ==1){
		out.println("alert('아이디/비밀번호 오류');");
		out.println("history.back();");
	}else{
		out.println("alert('시스템 오류');");
		out.println("history.back();");
	}
	out.println("</script>");
	
%>

 

//login_complete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="util.Cookies" %>
<%

	Cookies cookies = new Cookies(request);

	
    if(!cookies.exists("cid")|| !cookies.exists("cgroup")){
    	out.println("<script type='text/javascript'>");
    	out.println("alert('로그인 해야합니다.');");
    	out.println("location.href='login_form.jsp';");
    	out.println("</script>");
    }else if(cookies.getValue("cid").equals("")||cookies.getValue("cgroup").equals("")){
    	out.println("<script type='text/javascript'>");
    	out.println("alert('로그인 해야합니다.');");
    	out.println("location.href='login_form.jsp';");
    	out.println("</script>");
    }else{
    	//로그인 함
    	
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- login_complete.jsp -->
로그인 후 보여질 페이지 <br />
쿠키 아이디: <%=cookies.getValue("cid") %> <br/>
쿠키 그래이드: <%=cookies.getValue("cgroup") %> <br/>
사용자 이름: <%=cookies.getValue("name") %> <br/>
사용자 이메일 : <%=cookies.getValue("mail")%> <br/>


<br /><br />
<a href="logout_ok.jsp">로그아웃</a>
</body>
</html>
<%
}
%>

 

//logout_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="util.Cookies" %>
<%

	response.addCookie(Cookies.createCookie("cid", "","", -1));
	response.addCookie(Cookies.createCookie("cgroup","","", -1));

	out.println("<script type='text/javascript'>");
	out.println("alert('로그아웃 되었습니다.');");
	out.println("location.href='login_form.jsp';");
	out.println("</script>");
%>

개발환경 

    eclipse  + apache-tomcat

1.apache-tomcat 중지

2. hardcoding+pooling -simple board    (구조를 동일하게 만든다)

  1) jdbc driver

  2) context.xml

  3) java(x) - class

  3) css / image

  4) jsp

 

http://localhost:8080/board1/mariadb/simple1/board_list1.jsp   => 옮긴 파일 실행

 

3. model

=> 배포(deployment

C:\Java\apache-tomcat-9.0.80\webapps  => 배포를 위한 프로젝트 복사 경로

클래스 파일 실행을 위해

 

webapp

    css

    images

    mariadb 

        model1

                *.jsp

    META-INF

          context.xml

    WEB-INF

          lib

           cos.jar

           mariadb-java-client-3.2.0.jar

   

이클립스 안에서 file 오른쪽 클릭

=> export (war)  -> 자동 시스템 배포 (CI/CD)


< 확인사항 >

=> mariadb 드라이버 설정

=> COS.jar 추가

=> context.xml파일 추가

728x90
반응형