[Servlet] 필터 : Filter
필터
- 필터는 클라이언트 요청의 전처리 및 후처리에 호출되는 객체로 요청을 변환하거나 응답을 변경하는 기능을 수행한다.
- 필터는 주로 인증, 로깅, 데이터 압축이나 변환 , 요청 암호화 및 암호 해독 , 입력 유효성 검사 등과 같은 필터링 작업을 수행하는데 사용된다.
- 하나의 서블릿이나 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 |
댓글