[국비학원 기록/Servlet] 서블릿 필터(Filter), 필터 한글(utf-8) 인코딩
my code archive
article thumbnail
반응형
필터(Filter)

1)브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련해 여러 가지 작업을 처리하는 기능

 

2)요청이나 응답 시 공통적인 작업을 처리하는데 이용함.

 

필터 용도

 

1)요청 필터

-사용자 인증 및 권한 검사

-요청 시 요청 관련 로그 작업

-인코딩 기능

 

2)응답 필터

-응답 결과에 대한 암호화 작업

-서비스 시간 측정

 

3)관련 API

-javax.servlet.Filter
-javax.servlet.FilterChain
-javax.servlet.FilterConfig

 

 

Filter 인코딩 예제
필터 추가하는 방법

패키지 우클릭 - Filter

login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인</title>
</head>
<body>
    <form name="frmLogin" action="login" method="post" enctype="utf-8">
        이름 : <input type="text" name="user_name"><br>
        비밀번호 : <input type="password" name="user_pw"><br>
        <input type="submit" value="로그인">
        <input type="reset" value="다시 입력">
    </form>
</body>
</html>
cs
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
 
/**
 * Servlet Filter implementation class EncoderFilter
 */
@WebFilter("/*")        //WebFilter 애너테이션을 이용해 모든 요청이 필터를 거치게 함.
public class EncoderFilter implements Filter {    // 사용자 정의 필터는 반드시 Filter 인터페이스를 구현해야 함.
 
    ServletContext context;
    
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("utf-8 인코딩.......");
        context = fConfig.getServletContext();
    }
    
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("doFilter 호출");
        request.setCharacterEncoding("utf-8");        //한글 인코딩 설정 작업을 함
        String context = ((HttpServletRequest)request).getContextPath();    //웹 애플리케이션의 컨텍스트 이름.
        String pathinfo = ((HttpServletRequest)request).getRequestURI();    //웹 브라우저에서 요청한 요청 URI를 가져옴.
        String realPath = request.getRealPath(pathinfo);                    //요청 URI의 실제 경로를 가져옴.
        String mesg = "Context 정보 : " +context+ 
                      "\n URI 정보 : " +pathinfo+
                      "\n 물리적 정보 : " + realPath;
        System.out.println(mesg);
        // 요청 필터에서 요청 처리 전의 시간을 구함    //   △
        long begin = System.currentTimeMillis();    //     |    요청 필터 기능 
        chain.doFilter(request, response);            // 다음 필터로 넘기는 작업 수행함.
                                                    //   |    응답 필터 기능 
        // 응답 필터에서 요청 처리 후의 시간을 구함    //   ▽
        long end = System.currentTimeMillis();
        // 작업 요청 전과 후의 시간 차를 구해 작업 수행 시간을 구함.
        System.out.println("작업 시간: " + (end - begin) + "ms");
    }    
    
 
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        System.out.println("destroy 호출");
    }
 
 
 
 
 
}
cs
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
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("/login")
public final class LoginTest extends HttpServlet {
 
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //request.setCharacterEncoding("utf-8");   //post 방식으로 한글 전송 시 인코딩 작업 생략함.
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String user_name = request.getParameter("user_name");
        String user_pw = request.getParameter("user_pw");
        
        out.print("<html><body>");
        out.print("이름은 " + user_name + "<br>");
        out.print("비밀번호는 "+ user_pw +"<br>");
        out.print("</body></html>");
    }
}
cs

request.setCharacterEncoding("utf-8");을 주석처리 하고 실행하면

한글이 깨지지만 인코딩 필터 덕분에

콘솔창

 

 

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형