Cookie 와 Session

5 분 소요

cookie

웹브라우저에서 서버로 어떤 데이터를 요청하면 서버측에서 알맞은 로직 수행 후 데이터를 웹브라우저로 응답 후 서버는 웹브라우저와의 관계를 종료함(무상태 서버, 무상태 로직) 응답 후 관계를 끊는것은 http 프로토콜의 특징, 연결이 끊겼을 때 어떤 정보가 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 이용함.

  • 쿠키는 서버에서 생성 후 서버가 아닌 클라이언트 측에 정보를 저장함.
  • 서버에 요청할때마다 쿠키의 속성값을 참조 또는 변경 가능함.
  • 쿠키는 4kb로 용량이 제한적이며, 300개까지 데이터 정보를 가질 수 있음.

쿠키 문법

  1. 쿠키 생성 : 쿠키 클래스 이용
  2. 속성 설정 : setter를 이용
  3. response 객체에 쿠키 탑재 : response.addCookie() 를 이용
  • 쿠키 관련 메소드
메소드명 설명
setMaxAge() 쿠키 유효기간을 설정
setPath() 쿠키사용의 유효 디렉토리를 설정
setValue() 쿠키의 값을 설정
setVersion() 쿠키의 버전을 설정
getMaxAge() 쿠키 유효기간 정보를 얻음
getName() 쿠키 이름을 얻음
getPath() 쿠키 사용의 유효 디렉토리 정보를 얻음
getValue() 쿠키의 값을 얻음
getVersion() 쿠키버전을 얻음
<%
	Cookie cookie = new Cookie("id","pw");
	cookie.setMaxAge(60*60); //1시간
	response.addCookie(cookie);
%>
	<a href="Cookieget.jsp">getCookie</a>

  • 쿠키객체 생성 및 유효시간 설정한뒤 응답객체에 쿠키를 넣어둠.
<%
  Cookie[] cookies = request.getCookies();
for(Cookie cook : cookies){
  out.print(cook.getName());
  out.print(cook.getValue()+ "</br>");
}
%>
<a href="Cookiedelete.jsp">delete cookie</a>
  • 넘겨받은 쿠키의 이름과 값을 가져옴.
<%
	Cookie[] cookies = request.getCookies();
	for(Cookie cook : cookies){
		cook.setMaxAge(0);
		response.addCookie(cook);
	}
%>
<a href="Cookielist.jsp">cooklist</a>
  • 쿠키의 유효시간을 0으로 설정한뒤 다시 응답객체에 쿠키를 담아둠
	<%
		// 배열로 들어올수 있으므로 배열로 담음.
		Cookie[] cookies = request.getCookies();
		for(Cookie cook : cookies){
			// 반복문 이용해서 cook 속성관련 값 가져옴
			out.println(cook.getName()+ "</br>");
			out.println(cook.getValue()+ "</br>");
		}
	%>
  • 유효시간을 0으로 설정해 쿠키가 삭제된걸 확인할수있음.

session

세션이란 서버와의 관계를 유지하기 위한 수단임. 쿠키와 달리 클라이언트의 특정 위치에 저장되는것이 아닌 서버상에 객체로 존재함. 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터의 한계가 없음(각 요청마다 세션 객체가 생성됨.)

  • 세션은 클라이언트의 요청이 발생하면 자동생성됨.
    • 클라이언트 요청(웹브라우저) > session 자동 생성 > Session 속성 설정(session 내부 객체의 메소드 이용)

세션 문법

  • 관련 메소드
메소드명 설명
setAttribute() 세션에 데이터를 저장함.
getAttribute() 세션에서 데이터를 얻어옴 (Object 타입으로 받아옴.)
getAttributeNames() 세션에 저장되어 있는 모든 데이터의 이름(유니크한 키값) 을 얻음
getId() 자동생성된 세션의 유니크한 아이디를 얻음
isNew() 세션이 최초 생성되었는지 이전에 생성된 세션인지 구분
getMaxInactiveInterval() 세션의 유효시간을 얻음(가장 최근 요청시점을 기준으로 카운트)
removeAttribute() 세션에서 특정 데이터를 제거
Invalidate() 세션의 모든 데이터를 삭제
// login.html
<form action="login.jsp" method="post">
	<input type="text" name="id" size="10" />
	<input type="text" name="pw" size="10" />
	<input type="submit" value="전송">
</form>

// login.jsp : login 에서 보낸 값을 getParameter 메소드를 통해 가져온 뒤 비교 후 페이지이동
<%
	//html 에서 입력한 값을 가져옴.
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	
	// 가져온 값 비교
	if(id.equals("coin") && pw.equals("1000")){
		session.setAttribute("id", id);
		response.sendRedirect("pass.jsp");
	} else{
		response.sendRedirect("login.html");
	}
%>

// pass.jsp
<% 
	//모든 데이터의 키값을 가져와 열거형으로 저장
	Enumeration enumeration = session.getAttributeNames();
	//값을 차례대로 가져오기위해 hasMoreElements 메소드 사용
	while(enumeration.hasMoreElements()){
		// 가져온 값을 sName 에 담음.
		String sName = enumeration.nextElement().toString();
		//id 값을 value 에 다시 담은뒤 출력
		String sValue = (String)session.getAttribute(sName);
		
		if(sValue.equals("coin")){
			out.print(sValue); 
		}
	}
%>	
	<a href="logout.jsp">logout</a>

// logout.jsp
<%
	Enumeration enumeration = session.getAttributeNames();
	while(enumeration.hasMoreElements()){
		String name = enumeration.nextElement().toString();
		String value = (String)session.getAttribute(name);
		
		//열거형으로 저장된 value 값을 가져온 뒤 비교 후 세션 삭제
		if(value.equals("coin")){
			session.removeAttribute(name);
		}
	}
	response.sendRedirect("sessionList.jsp");
%>

//sessionList.jsp : 저장한 세션을 삭제 후 확인용
<%
	Enumeration enumeration = session.getAttributeNames();
	int i = 0;
	// i의값이 남아있다면 while 문을 돌아 세션의 값을 출력함.
	while(enumeration.hasMoreElements()){
		i++;
		
		String sName = enumeration.nextElement().toString();
		String sValue = (String)session.getAttribute(sName);
		
		out.print(sName + "</br>");
		out.print(sValue + "</br>");
	}
	if(i == 0) out.print("세션 없음");
%>

예외 페이지

지시자를 이용한 예외 처리

// page 지시자 속성중 errorPage 키워드를 사용
<%@ page errorPage="errorPage.jsp(페이지명)">

// errorPage.jsp
// 지시자를 사용해 isErrorPage 가 예외가 발생했을때 보여주는 페이지라고 명시 
<%@ page isErrorPage="true" %>
// 에러페이지 에서는 예외가 발생한게 아니기 때문에 status 를 200으로 설정
<% response.setStatus(200); %>

// body 에서 예외 메세지를 출력하기위해 exception 객체 사용 후 메세지 불러옴
<%= exception.getMessage() %>

web.xml 을 이용한 예외 처리

// web.xml 에 공통에러 페이지 설정
<error-page>
	<error-code>404</error-code>
	//에러가 발생하면 넘어갈 페이지 설정
	<location>/404code.jsp</location> 
</error-page>
<error-page>
	<error-code>500</error-code>
	<location>/500code.jsp</location>
</error-page>

// 404code.jsp 설정
// 에러 발생 시 해당페이지는 정상적인 페이지라고 설정해둠.
<% response.setStatus(HttpServletResponse.SC_OK); %>

Bean

반복적인 작업을 효율적으로 하기 위해 빈을 사용, JAVA 언어의 데이터(속성)와 기능(메소드) 로 이루어진 클래스. jsp 페이지를 만들고 액션태그를 이용하여 빈을 사용함.

  • 관련 액션 태그(useBean, setProperty, getProperty)

    주로 업데이트하고, 얻어오는 역할

    • useBean : 특정 Bean 을 사용한다고 명시할때 사용 ```java
    - Scope 범위 옵션
    - page : 생성된 페이지 내에서만 사용 가능
    - request : 요청된 페이지 내에서만 사용 가능
    - session : 웹브라우저의 생명주기와 동일하게 사용 가능
    - application : 웹 어플리케이션 생명주기와 동일하게 사용 가능
      
    - setProperty : 데이터 값을 설정할 때 사용
    ```java
    <jsp:setProperty name="빈이름" property="속성이름" value="속성(데이터) 값"/>
    

    -getProperty : 데이터값을 가져올 때 사용

    <jsp:getProperty name="빈이름" property="속성이름">
    
  • 사용 예시 ```java public class Student { private String name; private int age; private int grade; private int studentNum; public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public int getStudentNum() { return studentNum; } public void setStudentNum(int studentNum) { this.studentNum = studentNum; } }

//사용 시 선언해둘것.

//데이터 사용 시 setProperty 사용해서 데이터 추가

//데이터 불러올 시 getProperty 를 사용 이름: 나이: 학년: 번호:


## 커넥션 풀 (DBCP)
> 클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 발생함 이러한 문제를 해결 하기 위해 커넥션 풀 기법을 사용. 케넥션 객체를 어느정도 미리 생성을 해두고 사용. tomcat 의 context.xml 파일에 추가


```java
//server > context
<Resource 
	auth = "Container" 
	driverClassName = "oracle.jdbc.driver.OracleDriver"
	url = "jdbc:oracle:thin:@localhost:1521:xe"
	username = "web_user"
	password = "oracle"
	name = "jdbc/Oracle11g"
	type = "javax.sql.DataSource"
	maxActive = "50"
	maxWait = "1000">
</Resource>


// DAO(db 연결 클래스)
private DataSource dataSource;
public MemberDAO() {
	Context context;
	try {
		context = new InitialContext();
		dataSource = (DataSource) context.lookup("java:comp/env/jdbc/Oracle11g");
	} catch (NamingException e) {
		e.printStackTrace();
	}

}
public ArrayList<MemberDTO> memberSelct(){
	ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();
	
	Connection con = null;
	Statement stmt = null;
	ResultSet rs = null;
	String sql = "SELECT * FROM JOIN";
	
	try {
		//데이터 연결 방법이 기존과 다름.
		con = dataSource.getConnection();
		stmt = con.createStatement();
		rs = stmt.executeQuery(sql);
		
		while(rs.next()) {
			String name = rs.getString("name");
			String id = rs.getString("id");
			String pw = rs.getString("pw");
			String phone1 = rs.getString("phone1");
			String phone2 = rs.getString("phone2");
			String gender = rs.getString("gender");
			
			MemberDTO dto = new MemberDTO(name, id, pw, phone1, phone2, gender);
			dtos.add(dto);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if(rs != null) rs.close();
			if(stmt != null) stmt.close();
			if(con != null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	return dtos;
}

카테고리:

업데이트: