필터는 클라이언트와 서버의 사이에서 내용을 추출하거나 걸러주고(필터링) 요청마다 특정 작업을 수행하는 역할을 한다. 로그를 남기거나 인코딩을 설정하는 역할로 가장 많이 사용되며 그 외에도 보안이나 트랜잭션, 에러 처리 등에도 사용할 수 있다. (로 - 보 - 트 - 에)
0. 필터 클래스 작성
필터 역할을 할 클래스를 작성한다. 필터 역할을 하는 클래스는 Filter 인터페이스를 구현해아한다.
Filter 인터페이스로 구현해야하는 추상 메서드는 3가지가 있다.
| void init(FilterConfig filterConfig) | - 필터 클래스가 초기화될 때 실행 |
| void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) | - 요청이 들어올 때 거쳐가는 메서드 - FilterChain 파라미터를 통해 다음 필터로 연결해주거나 요청을 처리하는 서블릿으로 연결해줄 수 있음 |
| void destroy() | - 필터 클래스가 작업을 마치고 제거될 때 실행 |
package filter;
import java.io.IOException;
import java.io.PrintWriter;
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 AuthenFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter01 초기화");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
System.out.println("Filter01.jsp 수행...");
// 요청 URI : /ch12/Filter.jsp?name=이상혁
String name = request.getParameter("name");
if(name == null || name.equals("")) {
// 톰캣에서 크롬으로 응답해주는 response 객체의 인코딩을 UTF-8로 설정
// 한글을 보내기 위함
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
String message = "입력된 name값이 null 입니다.";
writer.println(message);
return;
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("Filter01 해제...");
}
}
1. web.xml 작성
필터 클래스를 작성했다면 이를 web.xml에 등록해야한다. 필터의 등록은 <filter> 태그와 <filter-mapping> 태그를 사용한다.
<filter> 태그는 필터 클래스를 지정하는 역할을 한다. 필터의 이름(filter-name)을 설정하고 해당 필터의 클래스 파일(filter-class)을 연결한다.
<filter-mapping> 태그는 필터 클래스를 특정 경로와 연결하는 역할을 한다. 필터에 사용할 필터 클래스의 이름(filter-name)을 설정하고 해당 필터를 사용할 경로(url-pattern)를 지정한다.
<web-app>
<filter>
<filter-name>filter01</filter-name>
<!-- src 패키지 다음부터 입력하면 된다. -->
<filter-class>filter.AuthenFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<url-pattern>/ch12/filter01_process.jsp</url-pattern>
</filter-mapping>
</web-app>
* 필터에 파라미터 넘기기
web.xml에서 필터를 등록할 때 <filter> 태그 내부에 <init-param> 태그를 사용하여 필터 클래스로 파라미터를 넘길 수 있다. 이렇게 설정한 파라미터는 필터 클래스의 init() 메서드의 파라미터인 FilterConfig로 넘어오게 된다.
* <init-param> 설정
| <param-name> | - 파라미터의 이름을 설정 - 식별자의 역할을 함 |
| <param-value> | - 파라미터의 값을 설정 |
<web-app>
<filter>
<filter-name>filter02</filter-name>
<filter-class>filter.InitParamFilter</filter-class>
<init-param>
<param-name>param1</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>1234</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/ch12/filter02_process.jsp</url-pattern>
</filter-mapping>
</web-app>
필터 클래스에서 파라미터를 가져올 때는 init() 메서드의 FilterConfig 파라미터로부터 가져온다.
* FilterConfig의 메서드
| String getFilterName() | - web.xml에서 설정한 필터의 이름(filter-name)을 반환한다. |
| String getInitParameter(String name) | - web.xml에서 설정한 파라미터 이름(param-name)을 입력하여 파라미터의 값(param-value)을 가져온다. |
| Enumeration<String> getInitParameterNames() | - 모든 파라미터 이름을 Enumeration<String> 타입으로 반환한다. |
| ServletContext getServletContext | - ServletContext를 반환한다. |
package 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 InitParamFilter implements Filter {
private FilterConfig filterConfig = null;
// web.xml에서 파라미터로 넘어온 파라미터들을 filterConfig 매개변수로 받음
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter02 초기화...");
// 멤버 변수로 할당
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter02 수행...");
System.out.println(filterConfig.getInitParameter("param1"));
System.out.println(filterConfig.getInitParameter("param2"));
}
@Override
public void destroy() {
System.out.println("Filter02 해제...");
}
}
'JSP' 카테고리의 다른 글
| JSTL을 사용해 Session에 setAttribute() 하기 (0) | 2023.01.17 |
|---|---|
| JSTL을 사용해 HTML 태그 삽입하기 (0) | 2023.01.17 |
| 예외처리 (0) | 2023.01.13 |
| 다국어 처리 - 버튼을 이용한 언어 변경 구현 (0) | 2023.01.11 |
| fmt를 이용한 여러 방법의 다국어 처리 (0) | 2023.01.11 |