Servlet Cookie(쿠키)

최주영·2023년 5월 23일
0

Servlet

목록 보기
6/9

✅ 개발자가 원하는 시점에서 데이터 저장하는 방법

  • session
    -> 서버 컴퓨터에 저장됨, 객체 저장 가능, 크기 제한 x, 보안이 필요한 데이터들은 세션에 넣음

  • cookie
    -> client(사용자) 컴퓨터에 필요한 데이터를 저장하고 서버이용시에 가져오는 구조
    -> 객체저장 불가능, 문자열만 저장 가능, 크기에 제한 O,
    -> 보안에 필요하지않는 데이터들을 쿠기에넣음 ex) 아이디 저장, 최근본상품

  • 공통점 : 둘 다 저장구조는 key:value 형식임


// 쿠키 생성
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie c = new Cookie("readBoard","1$2$3$4"); // 쿠키 생성 (키 값 형식)
		c.setMaxAge(60*60*24); 
		// 쿠키 유지기한 차례대로 (초,분,시) -> 60 60 24 = 하루
		// 쿠키를 등록하기전에 먼저 기간을 정해줘야함 (순서 준수!)
		// 유효기간이 끝나기전까지는 브라우저를 닫아도 쿠키는 사라지지 않음
		response.addCookie(c); // 브라우저에 쿠키 저장
		response.sendRedirect(request.getContextPath()); // 메인으로 이동됨
	}
    
    
 // 쿠키 사용(쿠키값 가져오기)
 	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 쿠키값 가져오기
		Cookie[] cookies = request.getCookies(); // 쿠키의 반환형은 배열임 (키만 중복되지않으면 계속 저장됨)
		
		if(cookies!=null) {
			for(Cookie c : cookies) { // 쿠키메소드 : getName(), getValue()
				System.out.println(c.getName()); // 키 출력 
				System.out.println(c.getValue()); //  값 출력
				if(c.getName().equals("readBoard")) {
					String[] data = c.getValue().split("\\$");
					System.out.println(Arrays.toString(data));
//					StringTokenizer st = new StringTokenizer(c.getValue(),"$");
//					while(st.hasMoreTokens()){
//						System.out.println(st.nextToken());
					
				}
			}
		}
	}


// 쿠키 삭제
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 쿠키 삭제하기
		// 삭제할 쿠키와 동일한 key의 cookie 객체를 생성하고
		// setMaxAge(0)으로 설정
		Cookie c = new Cookie("readBoard","");
		c.setMaxAge(0);
		response.addCookie(c);
		response.sendRedirect(request.getContextPath());
	}
 
 
 // 세션 설정

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true); 
		//getSession 메소드에 boolean형으로 매개변수를 설정할 수 있다.
		// true -> 세션을갖고오되, 없으면 새로 생성해서 가져옴
		// false -> 세션을 갖고오지 않음
		session.setMaxInactiveInterval(5); // 세션 활동이 5초동안 없으면 세션삭제
		session.setAttribute("data", "sessionData");
		System.out.println(session);
		
		response.sendRedirect(request.getContextPath());
	}

✅ 서버에서 공통으로 사용하는 값에 대한 설정

  • context-param
  • 특정 고정값을 주고싶을 때 (모든 서블릿에 사용 가능)
// web.xml 파일

	<context-param>  <!-- context-param -->
		<param-name>admin</param-name> <!-- admin이라는 이름으로 admin@admin.com이 나옴 -->
		<param-value>admin@admin.com</param-value>
	</context-param>
// 자바파일
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
 				   throws ServletException, IOException {

		String contextdata = getServletContext().getInitParameter("admin");
        // 위와 같은 방법으로 context-param 값을 가져올 수 있다
        // 이 서블릿파일 말고도 다른 모든 서블릿파일에서도 사용 가능하다 -> context-param
		System.out.println(contextdata); 
	}

✅ 해당 서블릿에 적용한 곳만 사용 가능한 설정

  • init-param
  • 해당 서블릿에만 사용 가능
// web.xml 파일
	<servlet>  <!-- init-param -> 해당 적용한 서블릿에만 적용가능 -->
		<servlet-name>contextdata</servlet-name>
		<servlet-class>com.cookie.controller.ContextDataServlet</servlet-class>
        <!-- 위 클래스 파일에서만 사용가능함 -->
		<init-param>
			<param-name>servletdata</param-name>
			<param-value>testdata</param-value>
		</init-param>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>contextdata</servlet-name>
		<url-pattern>/contextdata.do</url-pattern>
	</servlet-mapping>
// 자바파일
package com.cookie.controller;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


//@WebServlet("/contextdata.do")
public class ContextDataServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
		// 서블릿 초기화 데이터 이용하기
		String servletdata = getInitParameter("servletdata"); // getInitParameter 메소드
		System.out.println(servletdata); // 이 클래스에서만 servletdata 값 사용 가능 (다른 클래스에서는 불가능)
	}


}

✅ 이클립스안에서 데이터베이스 활용하는 방법

  1. helper -> Eclips Marketplace -> dbeaver 23.0.5 설치 -> 동의한후 설치 다끝나면 재실행
  2. window -> show view -> other -> database naivgator 검색하고 open
  3. 콘센트모양 눌러서 원하는 데이터베이스 연결
  4. 포트번호, 종류, 아이디 비밀번호 확인해서 테스크 커넥션 한 후 -> 다운로스 클릭

✅ 서블릿을 통해 jdbc 데이터 연결하기

  • member 클래스는 따로 만들어야함!
package com.member.controller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.member.model.vo.Member;


@WebServlet("/memberall.do")
public class MemberSearchAllServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public MemberSearchAllServlet() {
   
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 자바코드
		// DB의 Member테이블에 있는 데이터를 가져와 화면에 출력해주기
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM MEMBER";
		
		List<Member> members = new ArrayList();
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",
												"student","student");
			conn.setAutoCommit(false);
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			while(rs.next()) {
				Member m = new Member();
				m.setMemberId(rs.getString("member_id"));
				m.setMemberPwd(rs.getString("member_pwd"));
				m.setMemberName(rs.getString("member_name"));
				m.setGender(rs.getString("gender"));
				m.setAge(rs.getInt("age"));
				m.setEmail(rs.getString("email"));
				m.setPhone(rs.getString("phone"));
				m.setAddress(rs.getString("address"));
				m.setHobby(rs.getString("hobby"));
				m.setEnrollDate(rs.getDate("enroll_date"));
				members.add(m);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null)rs.close();
				if(pstmt!=null)pstmt.close();
				if(conn!=null)conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
		
//		System.out.println("회원정보출력");
//		members.stream().forEach(System.out::println);
//		members.stream().forEach(e->System.out.println(e));

		request.setAttribute("members", members);
		
		RequestDispatcher rd =request.getRequestDispatcher("memberView.do");
		rd.forward(request, response);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}



// ("/memberView.do")
package com.member.views;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.member.model.vo.Member;


@WebServlet("/memberView.do")
public class MemberViewServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public MemberViewServlet() {}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		List<Member> members = (List)request.getAttribute("members");
        // request 반환타입은 object라서 List타입으로 형변환 해줘야함
		
		String html="<table>";
		html+="<tr>";
		html+="<th>아이디</th>";
		html+="<th>패스워드</th>";
		html+="<th>이름</th>";
		html+="<th>나이</th>";
		html+="<th>성별</th>";
		html+="<th>이메일</th>";
		html+="<th>전화번호</th>";
		html+="<th>주소</th>";
		html+="<th>취미</th>";
		html+="<th>가입일</th>";
		html+="</tr>";
		
		for(Member m : members) {
			html+="<tr>";
			html+="<td>"+m.getMemberId()+"</td>";
			html+="<td>"+m.getMemberPwd()+"</td>";
			html+="<td>"+m.getMemberName()+"</td>";
			html+="<td>"+m.getAge()+"</td>";
			html+="<td>"+m.getGender()+"</td>";
			html+="<td>"+m.getEmail()+"</td>";
			html+="<td>"+m.getPhone()+"</td>";
			html+="<td>"+m.getAddress()+"</td>";
			html+="<td>"+m.getHobby()+"</td>";
			html+="<td>"+m.getEnrollDate()+"</td>";
			html+="</tr>";
		}
		
		html+="</table>";
		out.print(html);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글