[JSP] Session / Cookie (로그인, 로그아웃 폼 만들기)
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를 이용한 로그인 / 로그아웃 구현하기
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파일 추가