본문 바로가기
IT/JSP

[JSP]Filter

by dya0 2019. 6. 17.

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
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
<!--     <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    </welcome-file-list> -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>_ch16.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>EUC-KR</param-value>
            </init-param>
        </filter>
 
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <servlet>
            <servlet-name>ServletTest</servlet-name>
            <servlet-class>ServletTest</servlet-class>
        </servlet>
 
        <servlet-mapping>
            <servlet-name>ServletTest</servlet-name>
            <url-pattern>/test</url-pattern>
        </servlet-mapping>
 
        <servlet>
            <servlet-name>test2</servlet-name>
            <servlet-class>test2</servlet-class>
        </servlet>
 
        <servlet-mapping>
            <servlet-name>test2</servlet-name>
            <url-pattern>/test2</url-pattern>
        </servlet-mapping>
    </web-app>
 
 

FilterForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    <%--실행되기 전에 요청해야하는 것... EUC-KR / UTF-8 설정 후 들어감  --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>필터예제</title>
</head>
<body>
<form action = "FilterProcess.jsp" method = "post">
한글이름 : <input type = "text" name = "name">
<input type = "submit" value = "확인">
</form>
</body>
</html>

FilterProcess.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
이름은 ${param.name}입니다.
</body>
</html>

post 요청인 경우 서버로 보내는 데이터는 메시지 바디에 있는데 서블릿에서 이 데이터를 꺼내려면 getParameter()를 호출해야 한다.
이 경우 한글이 깨지는 현상이 나타나서 해결하기 위해 request.setCharacterEncoding("euc-kr");을 사용했다.
각 서블릿 마다 위의 코드를 작성하는 것이 매우 번거러워 서블릿 필터를 이용해서 간단히 처리해 보자

* 필터 만들기 
1. javax.servlet.Filter 인터페이스를 구련해야 한다
2. init()
필터 객체가 생성되고 나서 주비 작업을 위해 딱 한 번 호출된다. 
Servlet 인터페이스의 init()와 같은 용도이다.
이 메서드의 매개변수는 FilterConfig 객체다
이 객체르 통해서 필터 초기화 매개 변수의 값을 꺼낼 수 있다. 
3. doFilter()
필터와 연결된 URL에 대해 요청이 들어오면 doFilter()가 호출된다. 
이 메서드에 필터가 할 일을 작성하면 됩니다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter) throws IOException, ServletException)
//서블릿이 실행되기 전에 해야 할 작업 
 다음 필터를 호출한다.  더 이상 필터가 없다면 서블릿의 service가 호출된다. 
 nextFilter.doFilter(request, response);
 // 서블릿을 실행한 후 , 클라이언트에게 응답하기 전에 해야할 작업 
  1) 매개변수 nextFilter는 다음을 가리킨다.
  2) nextFilter.doFilter(request, response);는 다음 필터를 호출한다. 더 이상 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.
  3) 만약 서블릿이 실행되기 전에 처리할 작업이 있다면 nextFilter.doFilter(request, response);전에 작성하자
  4) 만약 서블릿이 실행된 후에 처리할 작업이 있다면 nextFilter.doFilter(request, response);후에 작성하자 
 4. destroy() 
 서블릿 컨테이너는 우베 애플리케이션을 종료하기 전에 필터들에 대해 destroy()를 호출하여 마무리 작업을 할 수 있는 기회를 준다.
필터 배치 
1. web.xml

2. 애노테이션 사용 
@WebFilter(urlPattern="/*", initParams = {@WebInitParam(name="encoding", value="euc-kr")})

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
package _ch16;
 
 
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
 
 
@WebFilter("/CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {
    FilterConfig config;
    public CharacterEncodingFilter() {
    }
 
    public void destroy() {
        System.out.println("필터의 destroy()");
        // TODO Auto-generated method stub
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /*
        서블릿이 실행되기 전에 메시지 바디의 문자 집합을 먼저 설정하기 위해
         nextFilter.doFilter(request, response);호출 전에
        request.setCharacterEncoding(config.getInitParameter("encoding"));을 
        먼저 호출 
         */
        System.out.println("필터의 doFilter()");
        request.setCharacterEncoding(config.getInitParameter("encoding"));
        chain.doFilter(request,response);
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("필터의 init()");
        this.config = fConfig;
    }
 
}
 
 

필터 init() 실행

config : web.xml 정보를 다 가지고 있음 

-> dofilter 실행 chain 실행 

reloading 시 destroy

'IT > JSP' 카테고리의 다른 글

[JSP] MVC 패턴으로 만든 게시판 01 - net.board.action 패키지  (0) 2019.05.28
[JSP] 게시판  (0) 2019.05.28
[JSP]파일 업로드(미완성)  (0) 2019.05.24
[AJAX] 에이잭스  (0) 2019.05.21
[JSP] core ex 01  (0) 2019.05.20