protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //클라이언트 별로 저장 하는 곳을 분리하고 싶을 때 세션스코프를 사용한다. //어플리케이션 스코프를 사용하면 하나의 저장공간에 저장이 되어, c1,c2의 클라이언트가 값을 넣으면 두 군데가 같은 결과가 나오고 //리퀘스트 스코프로 하게 되면 응답을 하고 나면 저장 공간이 사라져서 값을 받아 올수가 없다. request.setCharacterEncoding("utf-8"); String text = request.getParameter("text"); //text를 session scope에 설정 HttpSession session = request.getSession();
//같은 타입의 데이터를 들어 오는 만큼 넣어 줄 것이기 때문에 ArrayList를 사용한다. (ArrayList를 사용안하면 먼저 들어온 값은 사라진다.) //기존의 list가 있으면 list값을 받아오고 없다면 새로 생성해서 값을 넣어 줘라. ArrayList list = (ArrayList)session.getAttribute("list"); if(list==null){ list = new ArrayList(); session.setAttribute("list", list); } list.add(text); response.sendRedirect("/myweb/session/write_form.html"); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //클라이언트 별로 저장 하는 곳을 분리하고 싶을 때 세션스코프를 사용한다. //어플리케이션 스코프를 사용하면 하나의 저장공간에 저장이 되어, c1,c2의 클라이언트가 값을 넣으면 두 군데가 같은 결과가 나오고 //리퀘스트 스코프로 하게 되면 응답을 하고 나면 저장 공간이 사라져서 값을 받아 올수가 없다. request.setCharacterEncoding("utf-8"); String text = request.getParameter("text"); //text를 session scope에 설정 HttpSession session = request.getSession(); //session.setAttribute("text", text); // (ArrayList를 사용안하면 먼저 들어온 값은 사라진다.) //같은 타입의 데이터를 들어 오는 만큼 넣어 줄 것이기 때문에 ArrayList를 사용한다. //기존의 list가 있으면 list값을 받아오고 없다면 새로 생성해서 값을 넣어 줘라. ArrayList list = (ArrayList)session.getAttribute("list"); if(list==null){ list = new ArrayList(); session.setAttribute("list", list); } list.add(text); response.sendRedirect("/myweb/session/write_form.html"); }
- 클라이언트의 상태값을 서버측에 저장하여 Session관리 - javax.servlet.http.HttpSession 객체를 이용하여 관리한다. - 클라이언트의 상태값은 Attribute로 관리됨
- 장점 - 관리할 수 있는 상태값(클라이언트 데이터)의 종류나 크기나 개수의 제한이 없다. - 서버에 저장되므로 cookie에 비해 보안상 유리
- 단점 - 서버에 부담
- HttpSession 객체 생성 - HttpServletRequest객체.getSession() - 기존 Session이 있으면 기존 Sesstion객체를 없으면 새로 생성하여 리턴 (ex : 로그인시 세션정보를 얻어옴) - HttpServletRequest객체.getSession(false) - jsp와 연동하면 의미가 없어진다. - 기존 Session이 있으면 기존 Session객체를, 없으면 null을 return
→ But, Servlet과 jsp를 같이 사용하는 코드에서는 두 가지를 비교할 의미가 없다. (오직 Servlet만 사용할때 사용)
-HttpSession 객체의 주요 메소드 - setAttribute(String name, Object value); - getAttribute(String name) : Object value - removeAttribute(String name) - getAttributeNames() : Enumeration - invalidate() : session객체를 소멸 시킨다. (로그아웃시 사용) - setMaxInactiveInterval(int 초) : 클라이언트가 마지막 요청을 한 뒤 인수로 받은 시간 만큼 지나도 요청이 안들어 오면 session을 소멸 시킨다. (활동하지 않은 간격의 최대치를 얻어온다.클라이언트가 마지막 요청을 한 뒤에 int초 만큼 시간이 지나도 들어오지 않으면 session을 소멸시킨다.) - getId() : String - jSessionId 값 return (session객체에 있는 id값을 조회 할 수 있다.)
- cookie의 단점 : text만이 값으로 저장된다. (id, 이름, 나이, 성별 이라 하면 4개의 객체가 저장이 되고, 이것을 문자열로 만들게 되면 객체는 하나가 되지만 각각의 값을 뽑아오기 힘들다. 따라서 session이 attribute로 관리를 하고 server에 저장을 하므로 보안적 측면에서도 좋아서 많이 사용한다. 자바 스크립트단에서는 cookie를 많이 쓴다.(ex : 경고창(하루동안 보이지 않겠습니다.)
* SetCookieServlet2
- servlet class package : servlet.cookie name : SetCookieServlet2
* 쿠키 관리 : 로그인과 같이 일정한 시간이나 웹브라우저가 켜져 있는 동안 데이터를 유지해야 할 때 서버에서 여러개의 쿠키 값을 생성하고 클라이언트에 데이터를 저장해 두었다가 필요할 때 마다 서버로 데이터값을 가져와 사용 하는 것이다.
- 쿠키 생성 - javax.servlet.http.Cookie 사용 - 하나의 쿠키 값을 가지는 객체 - HttpServletResponse.addCookie(Cookie c) : 쿠키를 client로 전송 ex) Cookie c = new Cookie("name","value"); response.addCookie(c); - 쿠키 값 조회 - HttpServletRequest.jetCookies() : Cookie[] ex) Cookie[] c = request.getCookies(); - Cookie 클래스 주요 메소드 - getName() : String - name 값 조회 - getValue() : String - value 값 조회 - setMaxAge(int 초) - 쿠키가 web browser에 저장될 시간 설정 초 : 양수 - 저장될 시간 음수 - web browser가 살아있는 동안(기본) 0 - 삭제(그 이름의 쿠키를 삭제)
* setCookieServlet1을 위와 같이 해두고, getCookieServlet을 실행해보면 1시간동안은 쿠키 정보가 유지되는 것을 볼 수 있다.
* 1시간 후에 다시 실행해 보면 500서버 에러가 발생한 것을 볼 수 있다. (이유는 쿠키 저장 값이 client로 부터 사라져서 서버에서 쿠키 값을 읽어 올 수 없기 때문이다.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //현재 시간을 쿠키정보로 만들어 클라이언트에 전송 //현재 시간 조회 Date date = new Date(); //날짜 포멧전환, E : 요일 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String nowDate = sdf.format(date);
Cookie c = new Cookie("nowDate",nowDate); //쿠키값 1개 생성 response.addCookie(c); //쿠키 정보를 client로 전송 //응답처리 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("현재 일시 : "+nowDate); out.println("<br><a href='/myweb/getcookie'>Get Cookie요청</a>"); out.println("</body></html>"); }
* session이란? client가 어플리케이션의 사용을 시작해서 끝날 때까지를 session이라 한다.
session관리 : 프로그램의 시작부터 끝날 때까지 데이터를 관리하는 것.(데이터가 끝날 때까지 데이터를 유지 ex : login~logout)
* Http protocal은 상태에 대한 데이터를 유지 할 수 없다. (요청하고 응답하면 데이터가 사라진다.)
* session관리
- Http 프로토콜은 stateless 한 특징을 가진다. - stateless - 상태유지를 못한다.-> 클라이언트의 데이터를 유지 하지 못함
- Session - 하나의 클라이언트가 프로그램을 시작해서 종료할때 까지 - 하나의 세션동안 여러번의 요청과 응답이 반복 될 수 있다. - 하나의 세션동안 클라이언트의 데이터는 유지 되어야 한다.
- Session 관리 개념 - Http 프로토콜의 특징이 클라이언트의 상태를 유지 못하므로 CGI에서 지원 - 방식 - Cookie를 이용 - Session을 이용 - URLRewriting을 이용
* Cookie를 이용한 Session관리 - 쿠키 - 서버가 브라우저(client)로 전송하는 text 데이터 - 쿠키는 클라이언트의 정보를 유지하기 위한 데이터로 Web Browser에 저장된다. - > 클라이언트 단에 저장 - key-value 형태로 관리됨 - 저장 데이터의 종류는 문자열만 가능 - Web Browser는 쿠키를 사이트 별로 관리한다. - 장점 - 서버에 부하를 줄일 수 있다. - 단점 - 관리할 수 있는 데이터의 종류, 크기에 제약 - 보안상 문제 - 구문 - 쿠키 생성 - javax.servlet.http.Cookie 사용 - 하나의 쿠키 값을 가지는 객체 - HttpServletResponse.addCookie(Cookie c) : 쿠키를 client로 전송 ex) Cookie c = new Cookie("name","value"); response.addCookie(c); - 쿠키 값 조회 - HttpServletRequest.jetCookies() : Cookie[] ex) Cookie[] c = request.getCookies(); - Cookie 클래스 주요 메소드 - getName() : String - name 값 조회 - getValue() : String - value 값 조회 - setMaxAge(int 초) - 쿠키가 web browser에 저장될 시간 설정 초 : 양수 - 저장될 시간 음수 - web browser가 살아있는 동안(기본) 0 - 삭제(그 이름의 쿠키를 삭제)
public class CounterServlet extends HttpServlet{ //변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.) private int visitCount; //카운트 한 값을 저장 시킬 공간 private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.txt"; //생성자( 객체 생성) public CounterServlet(){
} //객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기) public void init(){
public class CounterServlet extends HttpServlet{ //변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.) private int visitCount; //카운트 한 값을 저장 시킬 공간 //private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.dat"; private String counterFile; //생성자( 객체 생성) public CounterServlet(){
public class CounterServlet extends HttpServlet{ //변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.) private int visitCount; //카운트 한 값을 저장 시킬 공간 private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.txt"; //생성자( 객체 생성) public CounterServlet(){
} //객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기) public void init(){
public class CounterServlet extends HttpServlet{ //변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.) private int visitCount; //카운트 한 값을 저장 시킬 공간 //private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.dat"; private String counterFile; //생성자( 객체 생성) public CounterServlet(){