Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags more
Archives
Today
Total
관리 메뉴

David의 블로그

[JSP/Servlet]전처리 역할을 하는 Filter.필터 첫번째 본문

프로그래밍/Jsp_Servlet

[JSP/Servlet]전처리 역할을 하는 Filter.필터 첫번째

David 리 2024. 1. 28. 14:04

[Filter]

핉터는 클라이언트의 요청을 가장 먼저 받아 사전 처리하는 역할을 한다.

쉽게 말해 클라이언트가 요청을 보내면 JSP나 서블릿이 받기 전에 필터를 거친다. 웹 서버가 응답할 때도 마찬가지로 필터를 거쳐서 클라이언트로 전달된다.

다시 말해, 요청 정보에 특정한 처리를 미리 적용하거나 응답 내용을 변경 혹은 취소할 수 있다.

 

 

필터를 적용하는 방식

1. web.xml을 이용하는 방법

2. @WebFilter어노테이션을 적용하는 방법이 있다.

여기서는 web.xml로 적용하는 방식을 알아보겠다.

 

 

이번 예제는 web.xml로 필터를 적용해보고, 간단한 <form>태그를 만들어 요청방식이 get인지 post인지 알아보는 예제를 만들어 볼 것이다.

 

 

[web.xml]

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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>filter_practice</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  
    <!-- <filter>
        <filter-name>LoginCheck</filter-name>                        매핑할 필터 이름 
        <filter-class>filter.LoginCheckFilter</filter-class>        등록할 필터의 완전한 프로젝트 경로를 적어준다. 
    </filter>
 
     <filter-mapping>
        <filter-name>LoginCheck</filter-name>
        <url-pattern>/board/*</url-pattern>                            매핑할 필터 URL 
    </filter-mapping> -->
    
    <filter>
        <filter-name>BasicFilter</filter-name>
        <filter-class>filter.BasicFilter</filter-class>
        <init-param>
            <param-name>FILTER_INIT_PARAM</param-name>
            <param-value>필터 초기화 매개변수</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>BasicFilter</filter-name>
        <url-pattern>/15FilterListener/BasicFilter.jsp</url-pattern>
    </filter-mapping>
</web-app>
cs

web.xml에서 필터를 등록해주기 위해서 <filter><filter-mapping>태그를 사용해주어야 한다.

<filter-name>은 필터로 등록할 이름을 지정해주는 것이다.

<filter-class>는 필터로 등록할 클래스를 적어준다. 컨텍스트루트를 제외한 .을 이용해 등록해준다.

 

<init-param>안에 <param-name>, <param-value>는 

실제로 Filter인터페이스를 구현하면 반드시 오버라이딩을 해야하는 메소드중에 doFilter()가 있는데,

파라미터 FilterConfig는 servletContext타입으로 초기화 매개변수 값을 사용할 수 있다.

 

<url_pattern>은 매핑에 사용할 필터 URL을 지정해주는 것이다.

 

 

 

[BasicFilter.java]

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
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;
import javax.servlet.http.HttpServletRequest;
 
public class BasicFilter implements Filter{
 
    FilterConfig config;
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("BasicFilter -> destroy() 호출됨.");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        String filterInitParam = config.getInitParameter("FILTER_INIT_PARAM");
        System.out.println("BasicFilter -> 초기화 매개변수 : "+filterInitParam);
        
        String mode = ((HttpServletRequest)request).getMethod();
        System.out.println("BasicFilter -> 전송방식 : "+ mode);
        
        chain.doFilter(request, response);
        
    }
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        config = filterConfig;
        String filterName = config.getFilterName();
        
        System.out.println("BasicFilter -> init() 호출됨. : "+ filterName);
    }
 
    
}
 
cs

13Line : 필터 클래스로 사용하기 위해 Filter 인터페이스를 구현해주었다.

15Line : doFilter()에서 초기화 매개변수를 사용하기 위해 초기화 해줬다.

17, 37Line : destroy()와 init()은 웹 컨테이너가 처음 시작할 때와 종료가 될 때 '딱 한번' 실행된다.

default메소드여서 굳이 오버라이딩할 필요가 없지만 조작이 필요하다면 오버라이딩을 받아서 작성한다.

 

40Line : 위에서 언급한 매개변수 FilterConfig는 JSP의 내장객체 타입인 servletContext와 같다.

web.xml에서 <param-name>지정한 값을 가져온다.

 

23 ~ 32Line : 전역변수로 지정한 FilterConfig 객체를 이용해 <param-value>값을 가져온다. (config.getInitParameter()부분)

chain.doFilter()는 필터를 여러개 지정하든 1개만 지정하든 할 수 있다. 이 메소드를 이용해 다음 단계로 넘어갈 수 있다.

만약 생략한다면 웹 서버는 요청을 받지 못했으므로 브라우저에서는 아무 응답을 받을 수가 없다.

반드시 써줘야한다!.

 

 

 

[BasciFilter.jsp]

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <script type="text/javascript">
    function formSubmit(form, methodType) {
        if (methodType == 1) {
            form.method = "get";
        } else if (methodType == 2) {
            form.method = "post";
        }
        form.submit();
        
    }    
    </script>
    <h2>web.xml에서 매핑하기</h2>
    <form>
        <input type="button" value="Get 방식 전송" onclick="return formSubmit(this.form, 1);">
        <input type="button" value="Post 방식 전송" onclick="return formSubmit(this.form, 2);">
    </form>
</body>
</html>
cs

11 ~ 19Line : 'get'방식이면 get으로 서버에 전송한다., 'post'방식이면 post로 서버에 전송한다.

22Line : 보통 <form>태그에 전송할 URL을 action속성을 이용해 적어준다. action속성이 없으면 자기자신에게 전송하게 된다.

 

 

 

[결과]

이제 실행해 보도록 하겠다.

먼저 서버를 시작하면 콘솔에는 이렇게 찍힌다.

서버가 기동되면서 init()메소드가 호출된 것을 볼 수가 있다.

 

 

 

 

get방식 버튼 한번, post방식 버튼 한번 눌러보자.

 

 

 

 

첫 콘솔 다음에 순차적으로 찍힌 로그가 보인다.

 

 

 

[느낀점]

필터를 잘 알아놓으면 써먹을데가 많을 것 같다.