필터(Filter)
: HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 클래스이다.
Filter를 쓰는 이유는 불필요한 캐릭터 인코딩을 중복하지 않아도 되기 때문이다.
Filter는 웹 서버를 들어오기 전, 나가기 전에 검사한다.
GET방식과 POST방식의 캐릭터 인코딩 차이
GET 방식
1. get 방식 request 사용시 UTF-8로 처리되어 들어옴.
2. get 방식 response 사용시 charset=ISO-8859-1로 처리되기 때문에
response.setContentType("마임타입; charset=UTF-8"); 처리해주어야 한다.
POST 방식
1. post 방식 request 사용시 한글이 깨져서 들어옴.
request.setCharacterEncoding("UTF-8"); 처리해주어야 한다. (! 무조건 해줘야 함 !)
2. post 방식 response 사용시 한글 깨져서 처리됨.
response.seContentType("마임타입; charset=UTF-8"); 처리해주어야 한다.
JSP 프로그래밍에서 필터를 만드는 방법
1. javax에서 제공하는 Filter인터페이스(doFilter 메서드)를 구현한 구현 클래스를 만들어줘야 한다.
→ 이때 Filter를 사용하겠다고 chain.doFilter(request, response);를 꼭 적어주어야 한다.
2. Filter를 구현한 클래스를 사용하겠다고 web.xml 파일에 등록을 해줘야 한다.
필터(Filter) 예제
index.jsp 파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>여긴 index.jsp 파일</h1> <form action="ic" method="post"> id : <input type="text" name="id"> pw : <input type="text" name="pw"> <input type="submit" value="제출"> </form> </body> </html> | cs |
→ <form> 태그 : action은 ic, method는 post 방식
web.xml 파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>demo10</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> <filter> <filter-name>myFilter</filter-name> <filter-class>com.tenco.filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> | cs |
MyFilter.java 파일 ( javax에서 제공하는 Filter 인터페이스를 구현한 구현 클래스를 만들기.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.tenco.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println(">> 필터 초기화 <<"); } // doFilter 기억 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); //Filter --> Servlet 보내려면 chain.doFilter(request, response); //응답은 구현된 서블릿에서 직접 응답 처리를 지정하는 것이 좋다. // response.setContentType("test/plain; charset=UTF-8"); } @Override public void destroy() { System.out.println(">> 필터 destroy <<"); } } | cs |
→ Filter 인터페이스를 구현하여 doFilter()의 메서드에 필터를 사용하겠다고 chain.doFilter(request, response);를 반드시 적어주어야 한다.
IndexController.java Servlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package com.tenco.controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/inc") public class IndexController extends HttpServlet { private static final long serialVersionUID = 1L; public IndexController() { super(); } // GET 방식에 대한 복습 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // WEB-INF에 넣어두면 보안상으로 바로 접근할 수 없어서 forward 방식으로 처리를 한다. // http://localhost:8080/demo10/inc request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // post 방식 // 1. 요청으로 들어온 값 콘솔창 한글 깨짐. 해결방법 - setCharachterEncoding:UTF-8 // request.setCharacterEncoding("UTF-8"); String username = request.getParameter("name"); String pw = request.getParameter("pw"); System.out.println("username" + username); System.out.println("pw" + pw); // 2. 응답처리 // 2. 응답시 한글 깨짐. 해결방법 - setContentType 설정 response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("사용자 이름 : " + username); out.print(" "); out.print("사용자 비번 : " + pw); } } | cs |
→ WEB-INF 파일은 보안상으로 외부에서 바로 접근할 수 없는 폴더이기 때문에 Get방식으로 request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);를 사용하여 화면에 찍을 수 있다.
→ Filter를 사용하여 캐릭터 인코딩을 해주었기 때문에 불필요한 코드 중복을 줄이고, 한글이 깨지지 않고 출력할 수 있다.
→ request는 Filter로 받고, response는 써블릿에 써주는 게 좋다.
'프로그래밍 > JSP 프로그래밍' 카테고리의 다른 글
JSP 프로그래밍_JSP에서 파일 업로드 하기 (0) | 2023.04.06 |
---|---|
JSP 프로그래밍_RequestDispatcher (0) | 2023.03.27 |
JSP 프로그래밍_config 내장 객체, application 내장 객체, exception 내장 객체 (0) | 2023.03.27 |
JSP 프로그래밍_쿠키(Cookie) (0) | 2023.03.27 |
JSP 프로그래밍_세션(session) (0) | 2023.03.23 |