본문 바로가기

[Servlet] 필터 : Filter

인포꿀팁 발행일 : 2020-11-11

필터

  • 필터는 클라이언트 요청의 전처리 및 후처리에 호출되는 객체로 요청을 변환하거나 응답을 변경하는 기능을 수행한다.
  • 필터는 주로 인증, 로깅, 데이터 압축이나 변환 , 요청 암호화 및 암호 해독 , 입력 유효성 검사 등과 같은 필터링 작업을 수행하는데 사용된다.
  • 하나의 서블릿이나 JSP에 대한 요청이나 응답을 수정해야하는 경우에는 필터를 만들 필요가 없으며, 여러 개의 서블릿에 대한 요청 및 응답에 대한 사전 처리 또는 사후 처리를 적용하는 경우 작성한다.

 

종류

request 필터

요청 request이 백엔드의 자원에 도달하기 전에 필요한 전처리를 한다.

용도 : 

인증 : 사용자 ID를 기반으로 요청을 차단

로깅 및 감사 : 웹 응용 프로그램의 사용자 추적(요청정보를 로그파일로 작성)

인코딩 작업

 

response 필터

서버에서 요청에 대한 처리를한 후 클라이언트에 응답하기전에 후처리를 한다.

용도:

데이터 압축 : 다운로드 크기 줄임

XML 콘텐츠의 xsl/t 변환

총 서비스 시간 측정

 

javax.servlet.Filter 인터페이스

필터 클래스는 javax.servlet.Filter 인터페이스를 구현하여 작성

필터는 doFilter() 메소드에서 필터링을 수행한다.

모든 필터는 초기화 매개 변수를 얻을 수 있는 FilterConfig 객체에 액세스 할 수 있다.

메소드 설명
void init(public void init(FilterConfig filterConfig) 필터를 웹 컨테이너 내에 생성한 후 초기화할 때 호출
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 체인을 따라 다음에 존재하는 필터로 이동한다. 체인의 가장 마지막은 클라이언트가 요청한 최종 자원이 위치한다
void destroy() 필터가 웹 컨테이너에서 삭제될때 호출된다.

 

javax.servlet.FilterChain 인터페이스

FilterChain은 자원에 대한 필터링 된 요청의 호출 체인에 대한 뷰를 제공하는 개발자에게 서블릿 컨테이너가 제공하는 객체이다.

필터는 FIlterChain을 사용하여 체인의 다음 필터를 호출하거나 필터가 체인의 마지막 필터인 경우 체인의 끝에 있는 리소스를 호출한다.

메소드 설명
void doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException. ServletException 체인의 다음 필터가 호출되도록하거나 호출 필터가 체인의 마지막 필터인 경우 끝에 있는 자원을 호출하도록 한다.

 

필터 filter 설정

필터 인터페이스를 구현한 클래스를 작성한  후 서블릿 컨테이너가 필터를 찾아서 호출할 수 있도록 웹 어플리케이션 배포 기술자 파일에 필터를 등록한다,(web.xml)

 

1
2
3
4
5
6
7
8
9
10
  <filter>
      <filter-name>timerFilter</filter-name>
      <filter-class>com.filter.TimerFilter</filter-class>
  </filter>
  <!-- 필터를 언제 사용할지에 대한 설명 -->
  <filter-mapping>
      <filter-name>timerFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
 
cs

 

@WebFilter Annotation으로 설정하는 방법

필터 서블릿 클래스 상단에 @WebFilter Annotation으로 설정

 

 

예제) 게시판 서블릿의 사용자 유효성 검사를 해주는 필터 만들기

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
import com.member.SessionInfo;
 
//XML에서 MAPPING 하던걸 이런식으로 처리 가능
@WebFilter("/*")
public class LoginFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpSession session=req.getSession();
        SessionInfo info=(SessionInfo)session.getAttribute("member");
        
        if(info==null && isExcludeUri(req)==false) {
            String path="/WEB-INF/views/member/login.jsp";
            RequestDispatcher rd = req.getRequestDispatcher(path);
            rd.forward(request, response);
            return;
        }
        
        chain.doFilter(request, response);
    }
    
    
    //로그인 제외 uri
    private boolean isExcludeUri(HttpServletRequest req) {
        //true : 검사 x 
        String uri = req.getRequestURI();
        //cp/bbs/list.do
        String cp = req.getContextPath();
        uri=uri.substring(cp.length());
        // /bbs/list.do
        
        String []ss = {
            "/index.jsp",
            "/main.do",
            "/member/login.do",
            "/member/login_ok.do",
            "/member/member.do",
            "/member/member_ok.do",
            "/member/userIdCheck.do",
            "/resource/**"
        };
        if(uri.length()<=1) {
            //true : 검사 x 로그인 체크 x
            return true;
        }
        
        for(String s:ss) {
            if(s.lastIndexOf("/**")!=-1) {
                s=s.substring(0,s.lastIndexOf("**"));
                if(uri.indexOf(s)==0) {
                    return true;
                }
            }else if(uri.equals(s)) {
                return true;
            }
        }
        
        
        return false;
    }
    
    @Override
    public void destroy() {
        
    }
 
 
 
}
 
cs

'Web > JSP&SERVLET' 카테고리의 다른 글

[Servlet] 세션 : Session  (0) 2020.11.26
[Servlet] GET & POST  (1) 2020.11.24
[Servlet] 쿠키 : Cookie  (0) 2020.11.10
[Servlet] 서블릿 이란?  (0) 2020.11.06
[WEB] URL과 URI  (0) 2020.10.28

댓글