JSP에서 필터라는 개념을 생각해보자
필터는 당연 무엇인가를 거르는 속성이 있어야 한다.
간단한 예제코드를 보자
public class TestFilter implements Filter {
public TestFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println(">>> TestFilter::doFilter() 실행 전");
// pass the request along the filter chain
chain.doFilter(request, response);
System.out.println(">>> TestFilter::doFilter() 실행 후");
public void init(FilterConfig fConfig) throws ServletException {
}
}
필터를 생성한다면
테스트 필터의 생성자와
디스트로이
doFilter, init을 만들어준다
생성자는 다들 아시니 패스하고,
디스트로이는 안드로이드의 생명주기 함수와 같은 역할을 할것이다.
doFilter가 우리가 주로 사용할 메소드이다.
doFilter에서 자동으로 제공해주는 chain.doFilter(request, response)가 필터와 연결된 서블릿,jsp 불러주는 역할을 한다.
즉 필터에 서블릿을 설정해준다면 서블릿을 불리더라도
필터가 사전에 먼저 처리를 하고, 서블릿을 부른 뒤 또 필터가 받아서 처리를 하고 끝낸다
서블릿을 둘러싸는 껍데기라고 생각하면 된다.
로그인 처리나 로그아웃 처리같은 기능을 구현할 때 유용하게 사용되는 도구이다.
그렇다면 적용 서블릿을 어떻게 사용할까?
먼저 어노테이션 방법이 있다.
필터를 생성하게 되면 오버라이드, 서블릿과 같이 메소드 이름 위에 어노테이션을 달아준다
@WebFilter(filterName = "Filter",urlPatterns = {""},servletNames = {""})
public class Filter implements javax.servlet.Filter {
이러한 어노테이션은 필터의 속성과 적용 서블릿을 설정해준다.
필터의 이름은 다들 아실거고, urlPatterns는 필터가 어떤 url패턴의 서블릿을 처리할 것이나를 설정하는 것이다
만약 로그인 서블릿을 만들어 /login 으로 서블릿을 만들었다면, 저 부분에 적어주면 로그인 서블릿을 필터가 처리하게 된다.
서블릿의 이름으로도 직접 처리가 가능하다.
예제는 아래와 같다.
@WebFilter(
filterName = "testFilter",
urlPatterns = { "/test1" },
servletNames = { "test2Servlet" }
)
urlPatterns와 서블릿이름은 둘다 집합이기에 여러 대상을 처리할 수 있다.
하지만 어노테이션의 경우 필터의 순서를 설정하지 못한다
만약 로그인과 회원가입의 필터를 만들어 어노테이션으로 설정해준다면
회원가입 필터를 먼저 작동시키고 싶은데 어노테이션으로는 그 순서를 설정할 수 없게 된다.
때문에 어노테이션이 간편하더라도, web.xml을 직접 수정하여 필터를 적용시키는 방법을 많이 사용한다.
WEB-INF 페이지를 열어 web.xml을 켜서 작성하도록 하자
아래는 예문 코드이다.
<!-- 1번 필터 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>edu.web.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 2번 필터 -->
<filter>
<filter-name>authFilter</filter-name>
<filter-class>edu.web.filter.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/test1</url-pattern>
</filter-mapping>
<!-- 3번 필터 -->
<filter>
<filter-name>testFilter</filter-name>
<filter-class>edu.web.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/test1</url-pattern>
<servlet-name>test2Servlet</servlet-name>
</filter-mapping>
먼저 1번 필터는
encodingFilter라는 필터를 작동 시키려 한다. 클래스는 필터의 경로를 정의하면 된다.
init-param은 필터에게 간단한 데이터를 보내주는 역할을 한다.
아래는 encodingFilter의 init 메소드이다.
public void init(FilterConfig fConfig) throws ServletException {
System.out.println(">>> EncodingFilter::init() 호출");
// web.xml의 <filter> 태그 안에 있는
// <init-param>에 설정된 파라미터의 값을 읽음
encoding = fConfig.getInitParameter("charset");
} // end init()
init은 initiation의 약어로
필터가 처음 불릴 때 작동하는 메소드이다.
이 곳에서 web.xml에서 설정한 아이디 값을 통해 파라미터 값을 가져올 수 있다.
필요하다면 멤버변수를 하나 선언하여 데이터 값을 저장한뒤
나중에 사용하면 편할 것이다.
다시 본론으로 돌아와서
filter-mapping은 필터의 적용 서블릿을 설정하는 곳이다.
/* 의 의미는 익숙한 모든 서블릿에 적용하겠습니다 를 의미한다.
3번에서 볼 수 있듯이 맵핑은 서블릿의 이름으로도 설정이 가능하다
이렇게 web.xml에서 설정을 해준다면
필터는 1,2,3으로 순서대로 작동하여 프로그래머가 원하는 대로 작동시킬 수 있다.
'프로그래밍 > Web' 카테고리의 다른 글
CSS 파일이 변경 후 적용이 안될 때 (14) | 2018.02.10 |
---|---|
Ajax - Asynchronous JavaScript And XML (2/2) (0) | 2017.11.12 |
Ajax - Asynchronous JavaScript And XML (1/2) (1) | 2017.11.12 |