세션과 쿠키는 예전에 알아본 적이 있는데 Java를 사용하고서는 처음 알아보는 것이니 Java 에서는 어떻게 사용해야 하는지 알아볼까요?
개념은 예전에 작성한 글을 확인해보면 좋을 것 같아요.
Session & Token
웹 환경에서 사용자와 시스템 간에 데이터를 교환하기 위해 HTTP 방식을 사용합니다. HTTP 통신은 요청과 응답에 의해 동작하며, HTTP의 특징 중 가장 중요한 특징은 바로 Stateless 입니다. 문자 그대
pabeba.tistory.com
Cookie 만들기 & 보내기
package step1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class SetCookieServlet
*/
@WebServlet("/SetCookieServlet")
public class SetCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.print("<html>");
out.print("<body bgcolor=yellow>");
out.print("<h4>"+getServletConfig().getServletName());
out.print("</h4>");
// 클라이언트에 전송해서 저장할 쿠키 생성
Cookie cookie=new Cookie("testCookie","joy");
// 쿠키 유효시간 설정
// 만약 쿠키 유효시간을 설정하지 않으면 브라우저 실행시에만 유효
cookie.setMaxAge(20); // 20초 동안 유지되도록 설정
response.addCookie(cookie);//응답시 쿠키가 전송
out.print("cookie를 생성해 클라이언트에 전송<br><br>");
out.print("<a href=GetCookieServlet>GetCookieServlet으로 이동</a>");
out.print("<br><br><a href=index.html>home으로</a>");
out.print("</body>");
out.print("</html>");
out.close();
}
}
HTML 파일을 만들어 보내기 위해서 코드가 길지 사실 cookie에 대한 내용은 3줄 뿐입니다.
1. 쿠키 만들기
Cookie cookie=new Cookie("testCookie","joy");
Cookie 객체를 name 값과 value 값을 넣어서 생성합니다. (마치 key, value 값이 있는 map 객체 같아요.)
2. 쿠키 유효시간 설정
cookie.setMaxAge(20);
20초 동안 사라지지 않게 유지하기 위한 코드입니다.
3. 쿠키 보내기
response.addCookie(cookie);
응답에 쿠키를 더해서 보내는 코드입니다.
이렇게 보내면 쿠키는 클라이언트 브라우저에 저장되어서 보관됩니다. 확인하기 위해 크롬 브라우저를 열어 F12를 눌러 개발자 도구를 열고 어플리케이션에 들어가서 쿠키를 확인해보면
저희가 설정한 test 와 joy 가 나오게 됩니다. 저 쿠키가 20초동안 저장되었다가 사라지게 됩니다.
그렇다면 쿠키를 보내는 것을 확인했으니 저장된 쿠키를 확인하는 법도 알아야겠죠.
쿠키 확인
package step2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class GetCookieServlet
*/
@WebServlet("/GetCookieServlet")
public class GetCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body bgcolor=lime>");
out.print("<h4>" + getServletConfig().getServletName());
out.print("</h4>");
// 클라이언트에 저장된 쿠키 정보 반환
Cookie[] cookies = request.getCookies();
System.out.println("cookie array: " + cookies);
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals("testCookie")) {
out.print(cookies[i].getValue()+" value 쿠키 정보입니다");
break;
}
}
}
out.print("<br><br><a href=index.html>home으로</a>");
out.print("</body>");
out.print("</html>");
out.close();
}
}
1. 쿠키 받기
요청으로 들어온 쿠키들을 배열로 받아오는 메서드
Cookie[] cookies = request.getCookies();
배열로 받아오면 for문을 이용하여 쿠키를 확인하면 됩니다.
이렇게 잘 받아와집니다.
Session 생성 및 보내기
package step5;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
import model.MemberVO;
/**
* Servlet implementation class SessionOneServlet
*/
@WebServlet("/SessionOneServlet")
public class SessionOneServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body bgcolor=yellow>");
out.print("<h4>" + getServletConfig().getServletName());
out.print("</h4>");
//세션이 없으면 세션을 새로 생성, 있으면 기존 세션을 리턴
HttpSession session=request.getSession();
out.print(session.getId());
//세션에 회원 정보를 저장
out.print("<br><br>회원정보를 세션에 저장");
MemberVO memberVO=new MemberVO("java","a","아이유","종로");
session.setAttribute("mvo", memberVO);
out.print("<br><br><a href=SessionTwoServlet>SessionTwoServlet으로</a>");
out.print("<br><br><a href=index.html>home으로</a>");
out.print("</body>");
out.print("</html>");
out.close();
}
}
public class MemberVO {
private String id;
private String password;
private String name;
private String address;
public MemberVO() {
super();
}
public MemberVO(String id, String password, String name, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.address = address;
}
}
Member Value Object는 이렇게 정했습니다. (너무 코드가 길어서 짧게 만들어 놓은 것입니다.)
1. Session 생성하기
HttpSession session=request.getSession();
세션이 있으면 세션을 새로 생성하고, 있으면 기존 세션을 리턴합니다.
새로 만든 세션에 쿠키처럼 name 값과 value 값을 넣어서 보내줍니다.
2. Session에 객체 저장
session.setAttribute("mvo", memberVO);
Session 받기
package step6;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
import model.MemberVO;
/**
* Servlet implementation class SessionTwoServlet
*/
@WebServlet("/SessionTwoServlet")
public class SessionTwoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body bgcolor=lime>");
out.print("<h4>" + getServletConfig().getServletName());
out.print("</h4>");
// 세션이 없으면 null, 있으면 기존 세션을 리턴
HttpSession session = request.getSession(false);
if (session != null) {
out.print(session.getId());
// 세션에 회원 정보를 저장
out.print("<br><br>회원정보를 세션에서 반환받아 회원명을 출력<br><br>");
//부모타입 Object로 반환되므로 자식 MemberVO 타입으로 Object casting 해야 한다
MemberVO mvo=(MemberVO)session.getAttribute("mvo");
out.print("회원명:"+mvo.getName());
} else {
out.print("세션이 존재하지 않습니다");
}
out.print("<br><br><a href=SessionThreeServlet>SessionThreeServlet으로</a>");
out.print("<br><br><a href=index.html>home으로</a>");
out.print("</body>");
out.print("</html>");
out.close();
}
}
1. Session 받기
HttpSession session=request.getSession(false);
위에 작성한 session 생성문에 false 값을 넣으면
세션이 없으면 null 값을 반환하고 세션이 있으면 그 세션값을 받아옵니다.
2. Session Value 값 받기
MemberVO mvo=(MemberVO)session.getAttribute("mvo");
저장해 놓은 Member Value Object를 getAttribute(name)함수를 이용하여 가져옵니다.
Session 무효화
package step7;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionThreeServlet
*/
@WebServlet("/SessionThreeServlet")
public class SessionThreeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body bgcolor=aqua>");
out.print("<h4>" + getServletConfig().getServletName());
out.print("</h4>");
//request.getSession(false) : 기존 세션이 있으면 반환, 없으면 null 반환
HttpSession session=request.getSession(false);
if(session==null) {
out.print("세션이 존재하지 않습니다");
}else {
// 세션이 존재하면 세션을 무효화시킨다 => 로그아웃에 사용됨
out.print("session invalidate() 세션을 무효화시킴");
session.invalidate();
}
out.print("<br><br><a href=index.html>home으로</a>");
out.print("</body>");
out.print("</html>");
out.close();
}
}
1. Session 무효화시키기
session.invalidate();
받아온 Session을 invalidate() 메서드를 이용해서 무효화합니다. 로그아웃에 사용됩니다.
소감
코드가 길어서 복잡해 보이지만 역시 오늘 알아본 것도 간단한 세션, 쿠키 사용법입니다.
다들 월요일이어서 힘이 많이 들텐데 대단하다고 생각합니다. 그들의 출근, 통학 등등 아침부터 바쁜 사람들의 모습을 보니 나 또한 열심히 살아야겠고, 이러한 일이 반복되지 않기 위해서는 시간을 자유자재로 사용할 수 있는 부자가 되야겠다는 생각을 했습니다.
자신의 분야에서 뛰어나면서 경제적 여유까지 있는 삶은 어떨지 궁금한 하루입니다.
'코딩 개발 > Java' 카테고리의 다른 글
Model 1 Architecture (3) | 2023.05.25 |
---|---|
JSP HTTP 통신 (HTML <form>, <a> tag) (0) | 2023.05.23 |
JSP (feat. 기본 문법) (2) | 2023.05.21 |
Servlet - ServletConfig, ServletContext (0) | 2023.05.20 |
Java - Servlet 연동 (HTML <form>, <a> tag) (4) | 2023.05.19 |