Servlet

김강산·2022년 8월 22일
0

고급JAVA

목록 보기
13/15

Servlet Programming

프로그램(Java)언어 기본문법에 대한 이해 http 통신에 대한 이해

1. 서블릿 프로그래밍

1. 서블릿 기초

서블릿은 JSP 표준에 앞서 자바에서 웹 어플리케이션 개발을 위해 만들어진 표준으로,
규약에 따른 서블릿 개발 과정은 다음과 같다.

  • 서블릿 규약에 따라 자바 코드를 작성(HttpServlet 상속 후 필요 메서드 재정의)
  • 자바 코드를 컴파일하여 클래스 파일 생성.
  • 클래스 파일을 /WEB-INF/classes 디렉토리에 패키지 구조에 따라 저장.
  • web.xml 파일에 서블릿 클래스 등록 및 리퀘스트와의 매핑
    (서블릿 3.0 규약부터 @WebServlet 어노테이션으로 대체).
  • 톰캣등의 컨테이너 재실행(서블릿 리로딩 기능이 있는 경우 생략)
  • 웹 브라우저에서 요청 처리 결과 확인

HTTP 방식(method)별 구현 메서드
GET : protected void doGet(HttpServletRequest, HttpServletResponse)
throws ServletException, IOException
POST : protected void doPost(HttpServletRequest, HttpServletResponse)
throws ServletException, IOException

요청의 의미와 요청데이터 패키징 방식을 구분하기 위한 방법으로 정의도니 Http method
는 GET,POST, PUT, DELETE, HEAD, OPTION, TRACE등이 있으며, 이중 대부분의
웹서버와 브라우저에서 지원하면 일반적인 웹에서 사용되는 method는 GET 과 POST
가 있다.
서블릿의 callback 메서드 종류

  • lifeCycle 관련 메서드 : 생명주기내이ㅔ서 단 한번씩 호출되는 메서드(init, destroy)
  • request 처리 관련 메서드 : 요청 발생시마다 각 쓰레드 내에서 반복 호출되는 메서드
    (service 및 do ... 계열의 메서드)
    각 콜백 메서드의 호출 순서는 다음과 같다.
    객체 생성 직후 init 호출 -> 리퀘스트 발생시 service 호출 -> service 메서드내에서
    현제 리퀘스트의 http method 구분후 해당 do ... 메서드 호출 -> 객체 소멸 직전
    destroy 호출

서블릿 등록 및 매핑(web.xml, @WebServlet)

  • web.xml 에 직접 등록 및 매핑(Servlet 2.5 까지의 방식)
    서블릿 등록(servlet 엘리먼트 사용) 설정 종류
    : 서블릿을 등록하는 과정에 설정된 모든 정보는 서블릿의 콜백 메서드내에서
    ServletConfig 객체를 통해 접근 가능하다.
    • servlet-name : 객체를 통해 접근 가능하다.
    • servlet-class : 컨테이너 내에서 관리되는 서블릿 인스턴스의 이름을 지정
    • init-param : 서블릿의 초기화 파라미터 설정(param-name, param-value
      로 구성)
    • load-on-startup : 서블릿의 인스턴스 생성 순위 지정

에러 정보들을 가져와서 response가 끝날때 까지만 처리한다
작업이 끝이나면 response 와 request는 사라지고
다시 작업을 시작하면 response 와 request가 새로 만들어진다

ServletCookie

쿠키에 대하여...
(웹서버와 브라우져는 애플리케이션을 사용하는 동안 필요한 값을 쿠키를 통해 공유하여 상태를 유지함.)
1. 구성요소?

  • 이름
  • 유효시간(초)
  • 도메인 : ex) www.somehost.com, .somehost.com
  • 경로 : 쿠키를 공유할 기중경로를 지정한다. (지정하지 않으면 실행한 URL의 결로부분이 사용됨.)
  1. 동작방식
  • 쿠키 생성단계 : 생성한 쿠키를 응답데이터의 헤더에 저장하여 웹브라우져에 전송한다.
  • 쿠키 저장단계 : 웹브라우져는 응답데이터에 포함된 쿠키를 쿠키저장소에 보관한다.
  • 쿠키 전송단계 : 웹브라우져는 저장한 쿠키를 요청이 있을때마다 웹서버에 전송한다. (삭제전까지...) 웹서버는 브라우져가 전송한 쿠키를 사용하여 필요한 작업을 수행한다.
    보안에 취약하다는 단점이 있다

쿠키정보 설정하는 방법
1. 쿠키객체 생성하기. 사용불가문자(공백,=,"/?@:;)
Cookie cookie = new Cookie("키값", "value값");
쿠키값은 사용불가문자를 제외한 나머지 출력가능한 아스키 문자 사용가능함.
=> 이외의 값(예를들면 한글)을 사용시에는 URLEncoder.encode() 사용하여 처리함.
2. 쿠키 최대 지속시간을 설정한다.(초단위) => 지정하지 않으면 브라우져 종료시 삭제됨.
cookie.setMaxAge(606024); // 24시간
3. 응답헤더에 쿠키객체를 추가한다.
response.addCookie(cookie);
=> 출력버퍼가 플러시 된 이후에ㅣ는 쿠키를 추가할 수 없다.
(응답헤더를 통해서 웹브라우져에 전달하기 때문에...)

예제)

쿠키 2개를 만들었다.
브라우저에 지속시간을 만들어줬다.
유지시간이 끝이나면 쿠키정보가 사라진다.
쿠키는 클라이언트에 만들어지기 때문에 아직 만든 것이 아니다.
web.xml에 설정을 해주어야 사용이 가능하다.
모든 servlet은 설정을 해주어야 한다.

결과)
http://localhost:8088/ServletTest/T05ServletCookieTest?userId=Apple&name=김강산

플러시가 된상황에는 쿠키를 다시 만들어서 넣어줄 수 없다.
Netowrk에 set-Cookie가 있으면 쿠키를 만들어 달라는 걸 알수 있다.

request에 Headers에 보면 Cookie가 있다.
ServletTest에는 Cookie가 저장되어있기 때문에 ServletTest에 있는 어떤 브라우져에
가도 Cookie가 남아있다.

ReadCookie

예제)

쿠키배열로 가져온다.
향상된 for문으로 하나씩 꺼내온다.
name은 한글로 가져오기때문에 "UTF-8"로 디코딩한다.

결과)

사용중인 쿠키정보를 삭제하는 방법...
1. 사용중인 쿠키정보를 이용하여 쿠키객체를 생성한다.
2. 쿠키객체의 최대지속시간을 0으로 설정한다.
3. 설정한 쿠키객체를 응답헤더에 추가하여 전송한다.

예제)

읽어온 예제를 사용해서
if문으로 지속시간을 0으로 만들어준다.

결과)

ServletSession

세션(HttpSession)객체에 대하여...

  • 세션을 통해서 사용자(브라우져)별로 구분하여 정보를 관리할 수 있다..(세션ID 이용)
  • 쿠키를 사용 할 때보다 보안이 향상된다.(정보가 서버에 저장되기 때문에...)
  • 세션객체를 가져오는 방법
    HttpSession session = request.getSession(boolean값);
    boolean값 : true인 경우 => 세션객체가 존재하지 않으면 새로 생성한다.
    false인 경우 => 세션객체가 존재하지 않으면 null을 리턴한다.
    쿠키가 보안이 취약하기때문에 서버에 정보를 저장 할려고 할때 Session을 사용한다.

Session이란?
다음 작업이 시작할때까지의 논리적인 연결?
브라우져가 종료되지 않는다면 Session이 유지되서 HttpServletRequest와 HttpServletResponse가 계속 유지된다.
브라우져가 종료가 되는순간 Session이 종료된다.

예제)


세션객체 만들기
setAttribute를 이용해서 userId와 visit를 세션에 저장한다.
그러면 세션이 종료되지 않는다면 계속 남아있다.
실행을 해볼려면 web.xml에 작성한다.

결과)


종료되는 시간이 Session으로 나와있다.
한번더 같은 이름으로 들어가면

재방문이 출력된다.
그리고 요청이 될때마다.

방문횟수가 증가한다.
재방문을 할때 쿠키정보가 없다면 새로 만들어지고 있다면 쿠키정보를 가져온다.
처음 방문 한 걸로 하기위해선 내 아이디를 삭제하고 다시한다.
또는 브라우져를 완전히 껐다가 다시켜면 처음 방문이란 문구가 뜬다.
request를 사용하면 새로고침을 할때마다 지워지고 새로 만들어지기 때문에 안됨!

HttpSession session = req.getSession();
새로 생성할때 사용하면된다.

  • 세션 삭제 처리 방법
  1. invalidate() 메서드 호출
  2. setMaxInactiveInterval(int interval) 호출 => 일정시간(초)동안 요청이 없으면 세션객체 삭제됨.
  3. web.xml에 session-config 설정하기(분단위)
  4. session.invalidate(); // 세션객체 삭제
  5. session.setMaxInactiveInterval(10); 초단위이다.
  6. web.xml에
    분단위이다

정리
Cookie는 클라이언트단에 저장한다.
장점
서버쪽에 과부화를 덜 준다.
단점
보안성이 좋지않다.
쿠키정보를 탈취하거나 지워버리면 쉽게 해킹을 당하거나 지워져버린다.

Cookie
Cookie 생성방법은
Cookie라는 class를 제공한다.
setMaxAge로 접근한다.
만들어진 Cookie에 접근할려면 request메시지에 Cookie 를 이용하여 접근
request객체.Cookies(Cookie가 여러개이기 때문)
배열로 꺼내온다 getName, getValue로 꺼내온다.
지우는 방법은 setCookie를 사용해서 cookie.setMaxAge(0)유효시간은 0으로 만들어준다.

서블릿을 요청하는 HttpServletRequest
서블릿을 응답하는 HttpServletResponse
서버단에서 저장하는 HttpSession객체

Session
장점
보안성이 좋다.
Session은 브라우져를 완전히 꺼야 Session이 지워진다.
Session은 유지가 되기때문에 사용자 관련 정보를 취급한다.
브라우져만 켜져있다면 언제든지 꺼내 사용할수있다.
단점
메모리 관리가 안좋아진다.
Session은 브라우져를 완전히 꺼야 되기때문에 전역변수처럼 메모리를 계속 사용하고있다.

request에 getSession으로 불러와 사용할수있다 .
Session은 브라우져에 없으면 자동으로 생성하고
브라우져에 있다면 불러온다.

session.setAttribute("visitCnt", visitCnt)을 이용해서 꺼내올 수 있다.

삭제하는 방법
session.invalidate()을 사용해 삭제한다.
session.setMaxInactiveInterval(10)을 사용해서 분단위로 접근을 안하면 지워진다.

session-config
session-timeout 1 /session-timeout
/session-config
을 web.xml에 사용해 삭제한다.

중요한 객체 3개

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession

ServletContext

서블릿 컨텍스트 객체에 대하여...
1. 서블릿 프로그램이 컨테이너와 정보를 주고 받기 위한 메서드를 제공한다.
ex) 파일의 MIME TYPE 정보 가져오기, 요청정보 보내기, 로깅 등.
2. 웹애플리케이션 당 1개씩 생성된다.(Session은 사용자당 1개씩 생성)
3. 서블릿 컨텍스트 객체는 서블릿이 초기화 될때 ServletConfig 객체를 통해서
가져올 수 있다.

예제)


애플리케이션단 1개 생성.

실제경로를 사용해야 루트를 알고 접근할수있다.
속성값을 두번 쓰면 속성이름이 변경된다.
삭제를 할땐 ctx.removeAttribute("aatr1");로 삭제한다.

ServletFilter

서블릿 필터에 대하여...
1. 사용목적

  • 클라이언트의 요청을 수행하기 전에 가로채서 필요한 작업을 수행할 수 있다.
  • 클라이언트에 응답정보를 제공하기 전에 응답정보에 필요한 작업을 수행할 수 있다.
  1. 사용 예
  • 인증필터
  • 데이터 압축필터
  • 인코딩 필터
  • 로깅 및 감사처리 필터
  • 이미지 변환 필터 등.
    HttpServletRequest는 object이기때문에 어떤걸 넣어도 사용 가능하다.

예제1)


별표 는 Servlet전체를 필터하는것이고 그자리에 필터에 넣고싶은 Servlet을 넣으면 된다.

결과)

init()이 호출됨에따라 실행이 됬음을 알수있음.

initParameter 설정
예제2)

결과)

서블릿도 똑같이 설정해줄 수 있다.

시간 계산하기
예제3)

결과)

필터체인 순서
클라이언트에서 서버로 요청할때 클라이언트 요청 -> 예제1필터 -> 예제2필터 -> 서버
서버에서 클라이언트로 응답할때 서버 응답 -> 예제2필터 -> 예제1필터 -> 클라이언트

ServletListner

리스너란? 이벤트, 리스너, 이벤트핸들러 간략 개념정리
리스너는 단어의 뜻으로 보자면 (소리를) 듣는 사람, 청취자입니다. 프로그래밍에서의 리스너는 무언가 소리를 듣는 사람을 뜻하기 보다는 특정 이벤트(특정한 사건)가 발생하기를 '귀 기울여' 기다리다가 실행되는 컴포넌트(메서드나 함수)를 말합니다.

Request 사용
예제)


결과)

TomCat이 true로 바꿔줌

Session 사용
예제)



결과)

Context 사용
예제)



결과)

복습
servletContext
tomcat을 구동시켜 서비스할 상태가되면 자동으로 생성된다
애플리케이션이 서비스를 중지할 때 까지 구동된다

servletFilter
여러개를 쌓아서 구동시키는 필터체인
클라이언트에서 서버로 요청 할때 필터체인을 거쳐서 서버로 요청
서버에서 클라이언트로 응답할땐 반대 순서로 응답

ServletListener
컨테이너에서 발생한 이벤트를 처리한다
tomcat에 ServletListener를 넣어 놓으면 자동으로 이벤트 들을 처리한다

ImageServlet

이미지를 보낼수있다

예제)

결과)

0개의 댓글