270 likes | 412 Views
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 작업.
E N D
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> <servlet-name>hello</servlet-name> <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 사용 /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\">packagedHello Servlet! </body></html>"); } public void destroy() { System.out.println("destroy!!!"); } }
Servlet Mapping • 컴파일 및 클래스 파일 위치 • sjc.bat로 컴파일 • 클래스 파일 위치 확인 • web.xml 재구성 /2006777888/WEB-INF/web.xml <servlet> <servlet-name>hello</servlet-name> <servlet-class>test.web.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/MyHello</url-pattern> </servlet-mapping>
Servlet Mapping • Package 사용한 Servlet Mapping http://localhost:8080/2006777888/MyHello
Servlet Context & Config • Servlet Context • Web Application 마다 1개의 Context 존재 • javax.servlet.ServletContext 로 정의되어 있다. • 서블릿과 Tomcat 컨테이너간에 통신하기 위해서 사용되어진다. • ServletContext 객체는 Tomcat 컨테이너와 동일한 LifeCycle를 갖는다. • 용도 • 서블릿에서 파일접근시 사용 • 로그파일 작성시 사용 • context 파라미터를 이용 할 때 사용
Servlet Context & Config • Servlet Config • javax.servlet.ServletConfig로 정의되어 있다. • 서블릿마다 하나의 ServletConfig가 생성된다. ( 공유불가 ) • 서블릿 초기화시 필요한 정보를 컨테이너에서 제공 받을 수 있다. • ServletConfig 객체는 서블릿과 동일한 LifeCycle를 갖는다. • 용도 • ServletContext을 얻을 때 사용한다. • 초기 파라미터를 이용 할 때 사용된다.
context2 context1 context3 Servlet Context & Config • Container – Servlet Context - Servlet Config Tomcat (Container) ServletContext ServletContext 서블릿1 ServletConfig 서블릿1 ServletConfig 서블릿2 ServletConfig 서블릿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 예제 • Servlet Context실습 • web.xml에 파라미터를 설정하고 여러서블릿에서만 사용할 수 있다. • <servlet></servlet> 태그 외부에서 <context-param></context-param>사용 • 서블릿에서는 ServletContext객체의 getInitParameter 메소드를 이용하여 설정된 값을 사용한다.
쿠키 (Cookie) • 쿠키 정의 • HTTP 한계를 극복할 수 있도록 웹사이트의 방문기록을 클라이언트에 저장하여 사용자와 웹사이트 사이를 매개해 주는 정보이다. • 특징 • 정보가 클라이언트에 저장된다. • 용량에 제한이 있다. ( 도메인당 20개씩 총 300 개, 파일용량은 4kb ) • 보안이 취약하다. • 클라이언트에 의해서 사용 유무가 결정된다. • 도메인당 쿠키가 생성된다. • 용도 • 로그인시 ‘ID저장’ 기능 구현 • 팝업창에 대해서 ‘오늘은 더 이상 창 열지 않기’ 구현 등에서 사용된다 • 사이트의 고객맞춤 정보 제공 (타깃 마케팅)
www.abc.co.kr 1. 브라우저로 특정 도메인에 요청한다. 3. 쿠키를 가지고 클라이언트에 응답한다. 4. 쿠키를 클라이언트에 저장한다. 쿠키 (Cookie) • 쿠키 동작 원리 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 를 생성하고 세션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 /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) <servlet> <servlet-name>session</servlet-name> <servlet-class>test.web.SessionTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>session</servlet-name> <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초후