GET요청이란?
URL을 통해 서버에 데이터를 전달하며, 일반적으로 쿼리 스트링을 사용하여 정보를 전달한다.
입력값이 적을 때 사용한다.
- URL에 변수(데이터)를 포함시켜 요청
- 데이터를 Header(헤더)에 포함시켜 전송
- URL에 데이터가 노출되어 보안에 취약
- 캐싱 가능
ex) hi?cnt=3 이라고 한다면 .getParameter("cnt")로 받고 이것은 문자열이기 때문에 Integer.parseInt()를 사용해 정수형으로 바꾼다.
@WebServlet("/hi")
public class Nana extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
int cnt=Integer.parseInt(req.getParameter("cnt"));
for( int i=0; i<cnt; i++ ) {
out.println((i+1)+": 안녕 Servlet <br>");
}
}
}

- hi?cnt=3 >>> "3"
- hi?cnt= >>> ""
- hi? >>> null
- hi? >>> null
- 따라서 에러방지를 위해 null과 빈문자열인지 조건문으로 확인해야한다.
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
환영합니다.<br>
<a href="hi">인사하기</a><br>
<a href="hi?cnt=3">인사하기</a><br>
</body>
</html>
Nana.class
@WebServlet("/hi")
public class Nana extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
String cnt_=req.getParameter("cnt");
int cnt=10;
if(cnt_!=null && !cnt_.equals("")) {
cnt=Integer.parseInt(cnt_);
}
for( int i=0; i<cnt; i++ ) {
out.println((i+1)+": 안녕 Servlet <br>");
}
}
}
index.html 실행 시
- 위 링크는 10번 출력
- 아래 링크는 쿼리스트링에 설정한대로 3번이 출력
GET 요청
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<form action="hi">
<div>
<label>"안녕하세요"를 몇 번 듣고 싶으세요?</label>
</div>
<div>
<input type="text" name="cnt" />
<input type="submit" value="출력" />
</div>
</form>
</div>
</body>
</html>
- form태그의 hi : "hi"라는 URL로 데이터가 전송
- <input type="text" name="cnt" /> : name 속성은 이 필드의 이름을 정의
- <input type="submit" value="출력" /> : ex) http://localhost:8080/hi?cnt=5


POST요청이란?
POST 요청은 주로 사용자가 form을 작성하여 서버에 데이터를 제출할 때 사용된다. POST 요청은 데이터를 HTTP 요청 본문(body)에 담아서 전송한다.
일반적으로 데이터의 길이나 형태에 제한이 없어서 입력값이 많을 때 사용한다.
why? GET방식은 간단한 데이터를 URL에 넣도록 설계되어있다. HTTP자체는 URL길이에 제약을두지 않으나, 브라우저에는 최대 길이를 제한한다. 따라서 많은 입력값은 POST 요청이 적절하다.
- URL에 변수(데이터)를 노출하지 않고 요청
- 데이터를 Body(바디)에 포함
- URL에 데이터가 노출되지 않아서 기본 보안은 되어있음
- 캐싱 불가
POST요청
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<form action="notice-reg" method="post">
<div>
<label>제목:</label><input type=text name="title" type="text">
</div>
<div>
<label>내용:</label>
<textarea name="content"></textarea>
</div>
<div>
<input type="submit" value="출력" />
</div>
</form>
</div>
</body>
</html>
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
String title=req.getParameter("title");
String content=req.getParameter("content");
out.println(title);
out.println(content);
}
}
한글깨짐문제 발생
UTF-8은 멀티 바이트 문자이다. 영문은 1바이트, 한글은 2바이트가 사용된다.
톰캣은 ISO-8859-1로 1바이트로 읽는다. 따라서 한글은 깨지는 문제가 발생한다.
NoticeReg 클래스에 코드 추가 : 입력값을 UTF-8로 읽는다.
req.setCharacterEncoding("UTF-8");

서블릿 필터란?
서블릿 필터는 웹 애플리케이션에서 클라이언트의 요청이 서블릿에 도달하기 전후로 요청과 응답을 변경하거나 가로채는 데 사용되는 Java컴포넌트이다.
어노테이션을 사용해 서블릿 필터를 등록하고 필터체인을 통해 여러 필터를 순차적으로 실행한다.
- 요청/응답 변조 : 클라이언트 요청이 서블릿에 도달하기 전 또는 응답이 클라이언트에게 전송되기 전에 요청을 수정
- 인증 및 권한 부여 : 사용자가 로그인한 상태인지 확인하고, 특정 페이지에 대한 엑세스 권한 확인
- 로깅 : 클라이언트 요청과 서블릿 응답에 대한 로그 기록
- 캐싱 : 요청에 대한 응답을 캐싱해 서버 부하를 줄이고 응답시간 단축
- 데이터 압축 : 요청 및 응답 데이터를 압축해 응답시간 단축

그림으로 보면 자원이 받게 되는 요청 정보는 클라이언트와 자원 사이에 존재하는 필터에 의해 변경된 요청정보가 되며, 클라이언트가 보게 되는 응답 정보는 클라이언트와 자원사이에 존재하는 필터에 의해 변경된 응답정보가 된다.
필터는 클라이언트와 자원사이에 1개가 존재하는 경우가 보통이지만, 여러개의 필터가 모여서 하나의 체인(chain)을 형성할 수 있다. 여러개의 필터가 모여서 하나의 체인을 형성할 때 첫번째 필터가 변경하는 요청정보는 클라이언트의 요청정보가 되지만 체인의 두번째 필터가 변경하는 요청정보는 첫번째 필터를 통해서 변경된 요청정보가 된다. 즉 요청정보는 변경에 변경에 변경을 거듭한다. 응답정보의 경우도 요청정보와 비슷한 과정을 거치지만 차이점은 필터의 적용순서가 요청때와는 반대다.
또한 필터는 요청/응답 정보를 변경하는 역할 뿐 아니라 흐름을 변경하는 역할도 할 수 있다. 즉 필터는 클라이언트의 요청을 필터체인의 다음단계에 보내는 것이 아니라, 다른 자원의 결과를 클라이언트에 전송할 수도 있다.
출처 : https://twofootdog.github.io/Spring-%ED%95%84%ED%84%B0(Filter)%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/
모든 URL에 대해 filter로 UTF-8 적용하기
입력값을 UTF-8로 읽는 작업을 filter을 사용하여 매 클래스마다 해당 코드를 쓰지않는다.
1. 서블릿 필터를 설정하고 매핑
web.xml
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.servlet.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. Filter 사용
서블릿 필터를 구현한 CharacterEncodingFilter 클래스
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
// FilterChain chain : 흐름응 다음으로 넘겨줄지말지 결정
chain.doFilter(request, response);
System.out.println("after filter");
}
}
- chain.doFilter(request, response)
- 현재 필터가 처리한 요청과 응답을 다음 필터 또는 서블릿으로 전달하는 역할
- 이 메서드 호출 이후에 등록된 필터나 서블릿이 실행
참고 자료 출처 :
https://mangkyu.tistory.com/17
https://www.youtube.com/watch?v=6rfPAs9R-IM&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=16
https://www.youtube.com/watch?v=j6lXa1adyM0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=17
https://www.youtube.com/watch?v=mPtbKN-RIv0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=19
https://www.youtube.com/watch?v=d8GkAMpjDfs&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=21
'서블릿 JSP' 카테고리의 다른 글
Application 저장소 (0) | 2024.02.23 |
---|---|
입력 데이터 배열로 받기 (0) | 2024.02.21 |
Servlet 출력 형식의 이해 (0) | 2024.02.20 |
Annotation을 이용한 Servlet과 URL 매핑 (0) | 2024.02.20 |
Servlet 웹 입/출력 (0) | 2024.02.20 |