#17 Servlet Filter
# Filter
์๋ธ๋ฆฟ 2.3๋ถํฐ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )๊ฐ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋์ ๋, ์์ฒญ์ด ์๋ธ๋ฆฟ์ผ๋ก ๊ฐ๊ธฐ์ ์ ํํฐ๋ง์ ํ๋ ๊ธฐ์ ์ด๋ค. JSP/Servlet ์คํ์์๋ javax.servlet.Filter ์ธํฐํ์ด์ค๋ก ๊ตฌํํ์ฌ web.xml์ ๋ฑ๋กํ์ฌ ์ฌ์ฉํ๋ค.
Filter๋ ์ฑ๊ธํค์ ๊ตฌํํ๋์? (X)
// Filter ์ธํฐํ์ด์ค๋ Servlet๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
package javax.servlet;
import java.io.IOException;
public interface Filter {
// ์ฑ๊ธํด์ ๊ตฌํํ์ง๋ ์์ผ๋, ๋ณดํต 1๊ฐ์ ๊ฐ์ฒด๋ง์ ์์ฑํด์ ์ฌ์ฉํ๋ค.
// web.xml์ ์ค์ ์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์๋ ์๋ค.
public void init(FilterConfig filterConfig) throws ServletException;
// ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ์์ฒญ/์๋ต์ ์กฐ์ํ๊ณ
// FilterChain์ ์ด์ฉํด ์กฐ์ ์ดํ ์๋ ๋ชฉ์ ์ง์ธ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌํ๋ค.
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public void destroy();
}
public class LoggingFilter implements Filter {
//ํํฐ๊ฐ ์์ฑ๋ ๋ ์ด๊ธฐํ์ ์ฌ์ฉ
// config ๊ฐ์ฒด์์ ํํฐ ์ ๋ณด, ์ฃผ์ด์ง ํ๋ผ๋ฉํ, ์๋ธ๋ฆฟ ์ ๋ณด๋ฑ๋ฅผ ์ป์ ์ ์๋ค.
public void init(FilterConfig config) throws ServletException {
System.out.println("ํํฐ ์ด๊ธฐํ ๋จ");
}
//์์ฒญ์๋ง๋ค ํํฐ๊ฐ ์คํํ ๋ฉ์๋
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("์์ฒญ์ด ํํฐ์์ ์ฒ๋ฆฌ๋จ");
chain.doFilter(request, response); // ์กฐ์์ ์๋ฃํ ์์ฒญ/์๋ต์ ๋ฐํ.
System.out.println("์๋ต์ด ํํฐ์์ ์ฒ๋ฆฌ๋จ");
}
//ํํฐ๊ฐ ์ ๊ฑฐ๋ ๋ ์คํ
public void destroy() {
System.out.println("ํํฐ ์ ๊ฑฐ๋จ.");
}
}
// web.xml
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>test.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggingFilter1</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loggingFilter2</filter-name>
<url-pattern>/๋ฑ๋กํ url1</url-pattern>
<url-pattern>/๋ฑ๋กํ url2</url-pattern>
<url-pattern>/url3</url-pattern>
<servlet-name>๋ฑ๋กํ ์๋ธ๋ฆฟ ์ด๋ฆ</servlet-name>
</filter-mapping>
์ฐธ๊ณ ๋ก filter-mapping์ servlet-mapping๊ณผ ๋์ผํ๋ฉฐ, [ *.jsp ]๋ก ๋งคํํ๋ฉด ๋ชจ๋ jsp ์์ฒญ์ ํด๋น ํํฐ๊ฐ ์๋ํ๋ค. ๋ฑ๋ก๋ ํํฐ๋ ์ ์ ์์๋๋ก ์คํ๋๋ค. (๋จ ์ด๋ ธํ ์ด์ ์ผ๋ก ํํฐ๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ์๋ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.)
# ์ ํํฐ๊ฐ ํ์ํ์ฃ ?
์น ์ปดํฌ๋ํธ(Servlet, JSP)์์ ๊ณตํต์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ ์ผ์ ํํฐ๋ฅผ ํตํด ์ฒ๋ฆฌํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ UTF-8๋ก ์ธ์ฝ๋ฉํ๋ ์ฝ๋๋ฅผ ์๊ฐํด๋ณด์. ํด๋น ์ฝ๋๋ ๊ฑฐ์ ๋๋ถ๋ถ์ ์น ์ปดํฌ๋ํธ์์ ๋์ผํ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
request.setCharacterEncoding("utf-8");
String param = request.getParameter("param");
์ฝ๋์ ์ค๋ณต๋ ๋ฌธ์ ์ง๋ง, ๋ง์ฝ ์ ์ฒด ์ปดํฌ๋ํธ์ ๋ํด UTF-8์ด ์๋ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ์ธ์ฝ๋ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๊ธธ ์ ์๋ค. ์ฆ ์ ์ง๋ณด์๋ ๊ฐ๋ฐ ์ธก๋ฉด์์๋ ์ข์ง ์๊ธฐ์ ํํฐ๋ผ๋ ๊ฐ๋ ์ ์ด์ฉํด ๊ณตํต๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
# ํํฐ์ ์ฃผ์ ๊ธฐ๋ฅ
๋ก๊ทธ์ธ ์ฌ๋ถํ์ธ, ์์ฒญ/์๋ต ๋ก๊ทธ๊ธฐ๋ก, ๋ฐ์ดํฐ ์ค๋ฅ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ์์ถ&๋ณํ (์ธ์ฝ๋ฉ)๋ฑ์ ๋ณดํต ํํฐ๋ก ์ฒ๋ฆฌํ๋ค.
- ์๋ธ๋ฆฟ์ด ํธ์ถ๋๊ธฐ ์ ์ ์์ฒญ(request)๋ฅผ ๊ฐ๋ก์ฑ์ด ์กฐ์ํ๋ค.
- ์๋ธ๋ฆฟ์ด ํธ์ถ๋๊ธฐ ์ ์ ์์ฒญ์ ๊ฐ๋ก์ฑ์ด ์ ๊ฒํ ์ ์๋ค.
- ์๋ธ๋ฆฟ์ด ํธ์ถ๋๊ธฐ ์ ์ HTTP ์์ฒญ์ ํค๋๋ฅผ ์กฐ์ํ ์ ์๋ค.
- ์๋ธ๋ฆฟ์ด ํธ์ถ๋ ์ดํ ์๋ต(response)๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ ์ ๊ฐ๋ก์ฑ์ด ์กฐ์ํ๋ค.
- ์๋ธ๋ฆฟ์ด ํธ์ถ๋ ์ดํ ์๋ต ํค๋๋ฅผ ์กฐ์ํ ์ ์๋ค.
# @WebFilter ์ด๋ ธํ ์ด์ ์ผ๋ก ํํฐ ์ค์ ํ๊ธฐ
์๋ธ๋ฆฟ ์คํ 3.0 (Tomcat 7.0 ์ด์)๋ถํฐ ์ด๋ ธํ ์ด์ ์ ํตํ ๋งตํ(web.xml ์ค์ )์ ์ง์ํ๋๋ฐ, ํํฐ๋ ๋น์ทํ๊ฒ ์ง์ ํ ์ ์๋ค. ํํฐ ์คํ์์๋ ๋ณด์ฅํ์ง ์๋๋ฐ, ๋ง์ฝ ์์๊ฐ ํ์ํ๋ค๋ฉด ํํฐ ์ด๋ฆ๋ง ๋ฑ๋กํด๋๊ณ ๊ธฐ์กด์ web.xml ์์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ด์ฃผ๋ฉด ๋๋ค.
// web.xml์ ํํฐ๋ฅผ ๋ฑ๋กํ๋๊ฒ๊ณผ ๋์ผํ ์ฝ๋์ด๋ค.
@WebFilter(filterName ="loggingFilter")
public class LoggingFilter3 implements Filter {...}
// ๋งคํ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
@WebFilter("*.jsp")
public class LoggingFilter1 implements Filter {...}
@WebFilter("/target") // ๋งคํ URL ์
๋ ฅ
public class LoggingFilter2 implements Filter {...}
// URL ํจํด ์ง์ . ์ฌ๋ฌ๊ฐ์ผ ๋ {}์ฌ์ฉ
@WebFilter(urlPatterns= {"/target", "/target2"})
public class LoggingFilter3 implements Filter {...}
// ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ธ๋ฆฟ ์ง์ . ์ฌ๋ฌ๊ฐ์ผ ๋ {} ์ฌ์ฉ
@WebFilter(servletNames= {"boardController", "boardController2"})
public class LoggingFilter4 implements Filter {...}
# ํํฐ์ ์ ๋ ฅ ๊ฐ ๋ฃ๊ธฐ
ํ์ํ๋ค๋ฉด ํํฐ๋ฅผ ์คํํ ๋ ์ ๋ ฅ ํ๋ผ๋ฉํ๋ฅผ ์ค ์ ์๋ค.
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>test.HelloFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>encoding2</param-name>
<param-value>hi hello ์๋
!</param-value>
</init-param>
</filter>
@WebFilter(
value = {"/target", "/target2"},
initParams = @WebInitParam(name = "encoding", value = "UTF-8")
)
public class EncodingFilter1 implements Filter {...}
// ์
๋ ฅํ๊ณ ์ถ์ ํ๋ผ๋ฉํ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ๊ฒฝ์ฐ
@WebFilter(
initParams = {
@WebInitParam(name = "encoding", value = "UTF-8"),
@WebInitParam(name = "encoding2", value = "EUC-KR")
}
)
public class EncodingFilter2 implements Filter {...}
์ด๋ ๊ฒ ์ฃผ์ด์ง ํ๋ผ๋ฉํ๋ Filter ์ธํฐํ์ด์ค์์์๋ init() ๋ฉ์๋์์ ์ฌ์ฉํ ์ ์๋ค.
public void init(FilterConfig config) throws ServletException {
String encoding1 = config.getInitParameter("encoding1");
String encoding2 = config.getInitParameter("encoding2");
if(encoindg1 != null){
// ํํฐ๊ฐ ์์ฑ๋ ๋ ํ ์์
..
}
}
# @WebFilter ์ load-on-startup ์์ฑ
์๋ธ๋ฆฟ์ ๋ธ๋ผ์ฐ์ ์ ์ต์ด ์์ฒญ์์ init()๋ฉ์๋๋ฅผ ์คํํ์ฌ WAS ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ๋ก๋ํ๋ค.
๊ทธ๋์ ์๋ฒ๋ฅผ ์ ์ผ ์ฒ์์ ๊ฐ๋ํ ๋, ์๋๊ฐ ์๋นํ ๋๋ฆฐ๋ฐ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด load-on-startup ์์ฑ์ ์ด์ฉ ํ์ฌ ํธ์ถ ๋๊ธฐ์ ์ ๋ฏธ๋ฆฌ ์ด๊ธฐํ(=๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ) ํด๋ ์ ์๋ค.
- ํฐ์บฃ ์ปจํ ์ด๋๊ฐ ์คํ๋๋ฉด์ ํด๋น ์๋ธ๋ฆฟ์ ๋ฏธ๋ฆฌ ์ด๊ธฐํ ํด๋๋ค.
- ์ง์ ํ ์ซ์๋ ์ฐ์ ์์๋ฅผ ์๋ฏธํ๋ฉฐ, ์์์ซ์๋ถํฐ ๋จผ์ ์ด๊ธฐํ ๋๋ค.
- ํด๋น ์ต์ ์ ๊ธฐ๋ณธ ๊ฐ์ 0์ผ๋ก, ์ง์ ํ ์ซ์๊ฐ 0 ๋ณด๋ค ํฌ๋ฉด ์ปจํ ์ด๋๊ฐ ์คํ๋๋ฉด์ ์๋ธ๋ฆฟ์ด ์ด๊ธฐํ ๋๋ ๊ตฌ์กฐ.
web.xml์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ถ์ฌ๊ฐ๋ฅ.
<servlet>
<servelt-name>loadConfig</servelt-name>
<sevlert-class>LoadAppconfig</sevlert-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
// ์๋ธ๋ฆฟ ์คํ 3.0๋ถํฐ ์ ๊ณตํ๋ ์ด๋
ธํ
์ด์
์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ.
@WebServlet(name = "loadAppConfig", urlPatterns = { "/loadConfig" }, loadOnStartup = 1)
public class LoadAppConfig extends HttpServlet {
private ServletContext context;
@Override
public void init(ServletConfig config) throws ServletException {
// loadOnStartup ์์ฑ ๋๋ฌธ์ init()์ด ์๋ฒ์์๊ณผ ํจ๊ป ๊ฐ์ด ํธ์ถ๋ฉ๋๋ค.
...
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
...
}
}