본문 바로가기

프로그래밍/JSP 프로그래밍

JSP 프로그래밍_필터(Filter)

필터(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는 써블릿에 써주는 게 좋다.