Internet Computing Laboratory @ KUT Youn-Hee Han Servlet 101 – Part 2 Internet Computing Laboratory @ KUT Youn-Hee Han
Servlet Mapping 초기 개발단계의 Servlet URL과 Serlvet Class 연관에 대한 문제점 http://localhost:8080/2006777888/servlet/HelloServlet 요청이 길다. (항상 /servlet/ 이 포함됨) 보안에 취약하다. (구현 방법이 Servlet임이 노출됨) 서블릿 mapping 작업
Servlet Mapping Servlet Mapping 각 context에 저장된 web.xml 에서 설정한다. <servlet> 태그와 <servlet-mapping> 태그를 이용한다. 여러 개의 서블릿 mapping 도 가능하다. Note: <servlet>태그를 먼저 정의하고 <servlet-mapping> 태그를 정의하여야 한다.
Servlet Mapping Servlet Mapping 일치!!! /2006777888/WEB-INF/web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> … <servlet> <servlet-name>hello</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/MyHello</url-pattern> </servlet-mapping> </web-app> [주의] Tomcat 재시작 필요 일치!!!
Servlet Mapping Servlet Mapping http://localhost:8080/2006777888/servlet/HelloServlet http://localhost:8080/2006777888/MyHello
Servlet Mapping Package 사용 package test.web; import javax.servlet.*; /2006777888/WEB-INF/src/HelloServelt.java package test.web; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloServlet extends HttpServlet { public void init() { System.out.println("Init!!!"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { System.out.println("packaged modified doGet!!!"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body bgcolor=\"yellow\">packaged Hello Servlet! </body></html>"); public void destroy() { System.out.println("destroy!!!");
Servlet Mapping 컴파일 및 클래스 파일 위치 web.xml 재구성 sjc.bat로 컴파일 클래스 파일 위치 확인 /2006777888/WEB-INF/web.xml <servlet> <servlet-name>hello</servlet-name> <servlet-class>test.web.HelloServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/MyHello</url-pattern> </servlet-mapping>
Servlet Mapping Package 사용한 Servlet Mapping http://localhost:8080/2006777888/MyHello
Servlet Context & Config Web Application 마다 1개의 Context 존재 javax.servlet.ServletContext 로 정의되어 있다. 서블릿과 Tomcat 컨테이너간에 통신하기 위해서 사용되어진다. ServletContext 객체는 Tomcat 컨테이너와 동일한 LifeCycle를 갖는다. 용도 서블릿에서 파일접근시 사용 로그파일 작성시 사용 context 파라미터를 이용 할 때 사용
Servlet Context & Config Servlet Config javax.servlet.ServletConfig로 정의되어 있다. 서블릿마다 하나의 ServletConfig가 생성된다. ( 공유불가 ) 서블릿 초기화시 필요한 정보를 컨테이너에서 제공 받을 수 있다. ServletConfig 객체는 서블릿과 동일한 LifeCycle를 갖는다. 용도 ServletContext을 얻을 때 사용한다. 초기 파라미터를 이용 할 때 사용된다.
Servlet Context & Config Container – Servlet Context - Servlet Config Tomcat (Container) context1 context2 ServletContext ServletContext 서블릿1 ServletConfig 서블릿1 ServletConfig 서블릿2 ServletConfig context3 서블릿1 ServletContext ServletConfig 서블릿2 ServletConfig 서블릿3 ServletConfig
Servlet 의 계층 구조 사용자정의 Servlet
Servlet Context & Config 예제 Servlet Config 실습 - 초기 파라미터(init parameter) 사용 web.xml에 파라미터를 설정하고 특정 서블릿에서만 사용할 수 있다. <servlet></servlet> 태그 내부에 <init-param></init-param> 사용 서블릿에서는 ServletConfig객체의 getInitParameter 메소드를 이용하여 설정된 값을 사용한다.
Servlet Context & Config 예제 web.xml에 파라미터를 설정하고 여러 서블릿에서만 사용할 수 있다. <servlet></servlet> 태그 외부에서 <context-param></context-param>사용 서블릿에서는 ServletContext객체의 getInitParameter 메소드를 이용하여 설정된 값을 사용한다.
쿠키 (Cookie) 쿠키 정의 HTTP 한계를 극복할 수 있도록 웹사이트의 방문기록을 클라이언트에 저장하여 사용자와 웹사이트 사이를 매개해 주는 정보이다. 특징 정보가 클라이언트에 저장된다. 용량에 제한이 있다. ( 도메인당 20개씩 총 300 개, 파일용량은 4kb ) 보안이 취약하다. 클라이언트에 의해서 사용 유무가 결정된다. 도메인당 쿠키가 생성된다. 용도 로그인시 ‘ID저장’ 기능 구현 팝업창에 대해서 ‘오늘은 더 이상 창 열지 않기’ 구현 등에서 사용된다 사이트의 고객맞춤 정보 제공 (타깃 마케팅)
쿠키 (Cookie) www.abc.co.kr 쿠키 동작 원리 2. 서버는 접속한 클라이언트 정보를 저장한 쿠키를 생성한다. 1. 브라우저로 특정 도메인에 요청한다. 3. 쿠키를 가지고 클라이언트에 응답한다. 4. 쿠키를 클라이언트에 저장한다. 2. 서버는 접속한 클라이언트 정보를 저장한 쿠키를 생성한다. 5. 도메인에 재요청시 저장된 쿠키를 서버에 넘겨준다. 6. 서버는 클라이언트에서 넘겨준 쿠키정보를 이용 하여 동일한 클라이언트인지를 판별한다.
쿠키 (Cookie) 로컬 하드디스크의 쿠키 예 관련 쿠키 생성
쿠키 (Cookie) 쿠키 프로그래밍 방식 클래스 javax.servlet.http.Cookie 이용한다. Cookie c = new Cookie(이름, 값) HttpServletResponse의 addCookie 메소드로 클라이언트에 저장한다. HttpServletRequest의 getCookies 메소드로 얻어온다.
쿠키 (Cookie) 실습 예제
쿠키 (Cookie) 실습 예제 (계속)
세션 (Session) 세션 정의 HTTP 한계를 극복할 수 있도록 웹사이트의 방문기록을 서버에 저장하여 사용자와 웹사이트 사이를 매개해 주는 정보이다. 특징 정보가 서버에 저장된다. 쿠키보다 보안에 유리하다. 서버에 부담이 될 수 있다. 브라우저 당 유일한 세션(세션 ID)이 하나씩 생긴다. 서버에 저장된 정보는 유효시간을 갖는다. 기본적으로 30분(1800 초)동안 유효하다. 용도 로그인 기능 구현 쇼핑몰의 장바구니 구현 등에 사용된다. 개인화 (Personalized) 홈페이지 구현
세션 (Session) www.abc.co.kr 세션 동작 원리 2. 서버는 접속한 브라우저에 대한 세션ID 를 1. 브라우저로 특정 도메인에 요청한다. 3. 세션ID를 가지고 클라이언트에 응답한다. 5. 도메인에 재요청시 저장된 세션ID 를 서버에 넘겨준다. 4. 세션ID 를 브라우저에 저장한다. 6. 서버는 클라이언트에서 넘겨준 세션ID를 이용하여 동일한 클라이언트(브라우저)인지를 체크한다.
세션 (Session) 세션 프로그래밍 방식 클래스 javax.servlet.http.HttpSession 이용한다. javax.servlet.http.HttpServletRequest의 getSession 메소드를 이용하여 세션을 얻어오거나 새롭게 생성한다. getSession() : 세션이 있으면 리턴하고 없으면 새로 생성해서 리턴한다. getSession(true) : 세션이 있으면 리턴하고 없으면 새로 생성해서 리턴한다. getSession(false) : 세션이 있으면 리턴하고 없으면 null을 리턴한다.
세션 (Session) javax.servlet.http.HttpSession 메소드
세션 (Session) 실습 예제 1 package test.web; import javax.servlet.*; /2006777888/WEB-INF/src/SessionTest.java package test.web; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import java.io.*; public class SessionTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=euc-kr"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); out.println("<HTML><BODY>"); out.println("Session ID: " + session.getId() + "<br/>"); out.println("Creation Time: " + new Date(session.getCreationTime()) + "<br/>"); out.println("Max Inactive Interval: " + session.getMaxInactiveInterval() + "<br/>"); if (session.isNew()) out.println("NEW"); out.println("<FORM METHOD=\"GET\" ACTION=\"/2006777888/sessionTest.jsp\">"); out.println("<INPUT TYPE=\"SUBMIT\" NAME=\"Go\"></FORM>"); out.println("</BODY></HTML>"); }
세션 (Session) 실습 예제 1 (계속) <servlet> <servlet-name>session</servlet-name> <servlet-class>test.web.SessionTest</servlet-class> </servlet> <servlet-mapping> <url-pattern>/SessionTest</url-pattern> </servlet-mapping> 실습 예제 1 (계속) /2006777888/WEB-INF/web.xml /2006777888/sessionTest.jsp <%@page contentType="text/html;charset=euc-kr"%> <%@page import="java.util.Date"%> <html> <body> <% out.println("JSP Session ID: " + session.getId() + "<br/>"); out.println("JSP Creation Time: " + new Date(session.getCreationTime()) + "<br/>"); out.println("JSP Max Inactive Interval: " + session.getMaxInactiveInterval() + "<br/>"); if (session.isNew()) out.println("NEW"); %> </body> </html>
세션 (Session) 실습 예제 2 /2006777888/WEB-INF/src/SessionTest.java … public class SessionTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=euc-kr"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.setMaxInactiveInterval(10); out.println("<HTML><BODY>"); 10초후