#17 Servlet Filter
by JiwonDev# 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(); ... } }
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev