π μΉμλΉμ€ νλ‘κ·Έλλ° 11μ₯ 리μ€λμ νν°
CHAP.11 리μ€λμ νν°
1. 리μ€λ
리μ€λλ?
- 리μ€λ(Listener)
- 컨ν μ΄λμμ λ°μνλ μ΄λ²€νΈλ₯Ό λͺ¨λν°λ§νλ€κ° νΉμ μ΄λ²€νΈκ° λ°μνλ©΄ μ€νλλ νΉμν μλΈλ¦Ώ, EventListnerλΌκ³ λ ν¨
- μΉ μ΄ν리μΌμ΄μ μ€νμ νμν μ 보λ₯Ό μ 곡νκ±°λ ν°μΊ£ μμ/μ’ λ£μ κ°μ νΉμ μν©μ μλμΌλ‘ λμνλ νλ‘κ·Έλ¨μ ꡬνν λ μ¬μ©
- 리μ€λλ μΌλ°μ μΈ ννμ μλΈλ¦Ώμ΄ μλλΌ νΉμ μ΄λ²€νΈμ λ°λΌ λμνλ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€
- 리μ€λκ° λμνκΈ° μν μ΄λ²€νΈμ μ’ λ₯μ κ·Έμ λ°λ₯Έ νλ‘κ·Έλ¨ APIλ₯Ό μμμΌ ν¨
- 리μ€λμ λμꡬ쑰
- κΈ°λ³Έμ μΌλ‘ μλͺ μ£ΌκΈ° λ³νμ Scope Objectμμ κ΄λ¦¬νλ μμ±μ λ³νλ₯Ό λͺ¨λν°λ§ νκ³ ν΄λΉ μ΄λ©νΈκ° λ°μνλ©΄ μ€νλλ ꡬ쑰
Servletκ³Ό JSPμμλ Page, Request, Sesscion, Applicationμ 4κ°μ§ μ€μ½νκ° μλ€.
- ex) ServletContext: μΉ μ΄ν리μΌμ΄μ λ¨μλ‘ μμ±λλ κ°μ²΄λ‘, λ³΄ν΅ ν°μΊ£μ μμκ³Ό μ’ λ£μ μΌμΉνκΈ° λλ¬Έμ ν΄λΉ μμ μ μ€νμ μνλ νλ‘κ·Έλ¨μ΄ μλ€λ©΄ 리μ€λλ‘ κ΅¬ν κ°λ₯
- 리μ€λμ λνμ μΈ μ ν
- μ΄κΈ°ν λ§€κ°λ³μμμ μ°λ
- ν°μΊ£μ΄ μμλ λ βweb.xmlβμ ServletContext μ΄κΈ°ν λ§€κ°λ³μλ₯Ό μ½μ΄ κ·Έμ λ°λΌ νΉμ κ°μ²΄λ₯Ό μ΄κΈ°ν ν ν μλΈλ¦Ώμ΄λ JSPμ μ 곡
- μμ νλ‘κ·Έλ¨ λ±μ λ°°ν¬ ν λ μν λ°μ΄ν° μ 곡
- DBκ° νμν κ²½μ° λ―Έλ¦¬ DBμ μ°κ²°μ λ§λ€μ΄ λκ±°λ, ν μ΄λΈμ μμ±νκ³ μν λ°μ΄ν°λ₯Ό λ‘λ©νλ λ±μ μμ μ μλμΌλ‘ μννμ¬ μΆκ°μ μΈ μμ μμ΄ νλ‘κ·Έλ¨ μ€ν
- 볡μ‘ν νκ²½ μ€μ μ 곡
- νλ‘κ·Έλ¨ μ€νμ νμν μ¬λ¬ μ 보(DB, λ€λ₯Έ μλΉμ€ μ°λ μ 보, κ΄λ¦¬μ κ³μ μ 보 λ± νλ‘κ·Έλ¨ μΈλΆμμ λ³νλ μ 보λ₯Ό μ£Όμ νλ νν)κ° κ³ μ λμ΄ μμ§ μκ³ , μ΄μνλ μλ² μν©μ λ°λΌ λ³κ²½λμ΄μΌ νλ κ²½μ°, μ΄λ₯Ό νμΌλ‘ μ½μ΄μ JSP λ° μλΈλ¦Ώ λ±μ μ 곡
- νΉμ μ΄λ²€νΈμ λμνλ κΈ°λ₯ ꡬν
- μΉ μ΄ν리μΌμ΄μ μ μ€νν λ ν¨κ» λμν΄μΌ νλ μΈλΆ νλ‘κ·Έλ¨μ΄λ μλΉμ€μ λμ μ 무λ₯Ό νμΈνκ³ μλμΌλ‘ μ€ν
- μ΄κΈ°ν λ§€κ°λ³μμμ μ°λ
-
리μ€λμ μ’ λ₯
μ ν μ€λͺ 리μ€ν° μΈν°νμ΄μ€ ServletContext
μλͺ μ£ΌκΈ° λ³νλνμ μΈ λ¦¬μ€λ μ΄λ²€νΈλ‘, ServletContextμ μμ±κ³Ό μλ©Έ μμ μ λμ
λ³΄ν΅ ν°μΊ£μ μμ λ° μ’ λ£ μμ κ³Ό μΌμΉνλ€javax.servelt.Servelt.ContextListener ServletContext
μμ± λ³νServletContextμ μμ±μ΄ μΆκ°λκ±°λ λ³κ²½λλ μν©μ λμνλ€ javax.servlet.ServletContextAttributeListner Session
μλͺ μ£ΌκΈ° λ³νSessionμ μμ±κ³Ό μλ©Έ λ± λ³νμ λ°λΌ λμνλ€ javax.servlet.http.HttpSessionListener Session
μμ± λ³νSessionμ μμ±μ΄ μΆκ°λκ±°λ λ³κ²½λλ μν©μ λμνλ€ javax.servlet.http.HttpSessionAttributeListener
리μ€λ κ·ν
- 리μ€λ ꡬν λ°©λ²
- μ΄λ Έν μ΄μ μ μ΄μ©ν΄ 리μ€λμμ λͺ μν ν, μ€λ²λΌμ΄λ© λ λ©μλ μ€μμ νμν λΆλΆμ μ½λ μμ±
// 리μ€λ ν΄λμ€μμ 컨ν μ΄λμ μ λ¬ @WebListener public class ListenerExam implements ServletContectListener{ // ServletContext μμ public void contextIniitialized(servletContextEvent sce){ sce.getServletContext().log("ServletContext μμλ¨!!"); } ... }
2. νν°
νν°λ?
- νν°(Filter)
- μλΈλ¦Ώ νν°(Servlet Filter)λΌκ³ λ νλ©°, 리μ€λμ λ§μ°¬κ°μ§λ‘ μΉ μ΄ν리μΌμ΄μ μ μ§μνκΈ° μν νΉμν ννμ μλΈλ¦Ώ
- ν΄λΌμ΄μΈνΈ μμ²μ λ°λΌ μλΈλ¦Ώμ΄λ JSPκ° μ€νλκΈ° μ μ response νΉμ request κ°μ²΄μ μ‘°μμ΄λ μΆκ°μ μΈ μ²λ¦¬
- νν°λ κΈ°λ³Έμ μΌλ‘ νΉμ μμ²μλ§ λμνλ©°, μ¬λ¬κ°μ νν°κ° μ ν΄μ§ μμμ λ°λΌ λ°°μΉλ μ μλλ° ν΄λΌμ΄μΈνΈ μμ² μ²λ¦¬ μ΄μ μ λ¨Όμ μ€νλ¨
- νν°μ λνμ νμ© λΆμΌ
- μΈμ¦(Authentication)
- μ΄ν리μΌμ΄μ ꡬ쑰μ μκ΄μμ΄ κΈ°μ‘΄ μμ€λ₯Ό μ΅λν μμ νμ§ μκ³ μΈμ¦ κΈ°λ₯μ μννλλ‘ ν μ μμ
- λ‘κΉ
/κ°μ¬(Logging and Auditing)
- νΉμ νμ΄μ§ λλ κΈ°λ₯μ λν΄ μ¬μ© νν©μ λͺ¨λν°λ§ νκ³ λ‘κ·Έλ‘ κ΄λ¦¬ν νμκ° μμ λ νν°λ₯Ό ν΅ν΄ ν΄λΉ μμ²μ μννκΈ° μ λ‘κΉ μ²λ¦¬
- κ΅μ ν(Localization)
- λ€κ΅μ΄ μ²λ¦¬λ νλ μμν¬ λ±μμ μ 곡νλ κ΅μ ν λ°©λ²μ μ²λ¦¬νκ±°λ, νν°λ₯Ό μ΄μ©νμ¬ νΉμ νμ΄μ§μ λ€μ΄κ° λ©μμ§ λ±μ ν΄λΉ μΈμ΄λ‘ λ³ννμ¬ μ λ¬
- νκΈ μΈμ½λ© μ²λ¦¬(Encoding)
- νν°λ₯Ό ν΅ν΄ νλ²μ νκΈ μΈμ½λ© μ²λ¦¬νλ λ°©λ²
- μΈμ¦(Authentication)
νν°μ ꡬ쑰μ λμ κ³Όμ
- νν°μ ꡬ쑰
- 리μ€λμ μ μ¬ν ꡬ쑰λ‘, νν°λ ν°μΊ£ μλ²λ₯Ό μμν λ νν° κ΅¬ν ν΄λμ€μ μ΄λ
Έν
μ΄μ
μ μ°Έμ‘°νμ¬
javax.servlet.Filter
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€ μ΄κΈ°ν - νν°λ μ¬λ¬κ° μ‘΄μ¬ ν μ μμΌλ©°, κ°κ°μ νν°λ
init()
λ©μλλ₯Ό ν΅ν΄ μ΄κΈ°νinit()
- νν° μ΄κΈ°ν μ νλ²λ§ μ€ν, μ¬μ©μ μμ²μ λ°λΌ μλΈλ¦Ώμ΄λ JSPκ° νΈμΆλ λ μ΄λ
Έν
μ΄μ
μΌλ‘ μ€μ λ νν° λ§€ν μ 보λ₯Ό μ°Έμ‘°ν΄ νΉμ μλΈλ¦Ώμ΄λ JSPμ λν΄ μλ‘ λ€λ₯Έ νν° μ μ© κ°λ₯
doFilter()
- ν΄λΉ νν°κ° μ μ©λμμ λ μνν μμ
μ ꡬννλ λ©μΈ λ©μλ
destroy()
- νν°κ° μ’ λ£λ λ μνν λ΄μ© ꡬν
- 리μ€λμ μ μ¬ν ꡬ쑰λ‘, νν°λ ν°μΊ£ μλ²λ₯Ό μμν λ νν° κ΅¬ν ν΄λμ€μ μ΄λ
Έν
μ΄μ
μ μ°Έμ‘°νμ¬
- νν°μ λμ ꡬ쑰
- κ° νν°μ
doFilter()
λ©μλμ λ΄μ©μ΄ μνλλ©°, ServletRequestμ ServletResponseμ λ΄μ©μ κ°λ‘μ± νμν μμ μ μννκ³ λ€μ νν°λ₯Ό μ λ¬νκ±°λ, μμ²ν μλΈλ¦ΏμΌλ‘ μ΄λ
- κ° νν°μ
νν° κ΅¬ν
- νν° κ΅¬ν
@WebFilter
μ΄λ Έν μ΄μ μ μ¬μ©ν΄ νν°μμ μλ¦¬κ³ μλΈλ¦Ώκ³Ό μ μ¬νκ² νν° μμ²μ μν url λ§€ν μ 보λ₯Ό μΈμλ‘ μΆκ°- μλ μμ±λλ μ€λ²λΌμ΄λ© λ©μλλ νμν λΆλΆλ§ ꡬν
- νν° μ체μ μλͺ
μ£ΌκΈ° λ©μλκ° ν¬ν¨λμ΄ μκ³ , μ€μ λ‘ νν°κ° λμν λλ
doFilter()
λ©μλ νΈμΆ
// νν°μμ μλ¦Ό @WebFilter("/EncodingFilter") public class EncodingFilter implements Filter{ ... public void doFilter(ServletRequest request, ServelResponse response, FilterChain chain) throws IOexception, ServletException{ ... chain.doFilter(request,response); } }
- νν° μ체μ μλͺ
μ£ΌκΈ° λ©μλκ° ν¬ν¨λμ΄ μκ³ , μ€μ λ‘ νν°κ° λμν λλ
- μ¬λ¬ κ°μ νν°λ₯Ό μμλλ‘ μ μ©νκΈ°
- μ¬λ¬κ°μ νν°λ₯Ό μ°¨λ‘λλ‘ μ μ©νλ €λ©΄ μ΄λ
Έν
μ΄μ
λ§μΌλ‘λ λΆκ°λ₯
- μ΄λ Έν μ΄μ μ μν νν° μ€νμ νΉμ url λ§€ν 쑰건μ λ°λΌ μ΄λ£¨μ΄μ§λ κ²μΌλ‘ μ€ν μμλ₯Ό μ‘°μ ν μ μμ
- νν°μ μ€ν μμλ₯Ό μ§μ νκΈ° μν΄μλ
web.xml
νμΌμ νν°λ₯Ό λ±λ‘- νν° μλΈλ¦Ώμ
@WebFilter
μλ url λ§€ν λμ filterName μμ±μ΄ λ€μ΄κ°μΌ ν¨
- νν° μλΈλ¦Ώμ
@WebFilter(filterName="filterOne") public class FirstFilter implements Filter{ ... }
- μ¬λ¬κ°μ νν°λ₯Ό μ°¨λ‘λλ‘ μ μ©νλ €λ©΄ μ΄λ
Έν
μ΄μ
λ§μΌλ‘λ λΆκ°λ₯
web.xml
μ νν°λ₯Ό λ±λ‘νλ μ½λμ μμweb.xml
μ΄ μλͺ»λλ©΄ μλ²κ° μ μμ μΌλ‘ λμνμ§ μμ μ μμΌλ―λ‘ μ£Όμ νμ
<!-- <filter/> μμλ μΉ μ΄ν리μΌμ΄μ μ΄ μλ° νν°μ λ§€κ°λ³μλ₯Ό μ€μ νλλ° μ¬μ© --> <filter> <!-- νν° μ΄λ¦ μ€μ --> <filter-name>...</filter-name> <!-- μλ° ν΄λμ€ μ΄λ¦ μ€μ --> <filter-class>...</filter-class> <!-- λ§€κ°λ³μμ κ°μ μ€μ --> [<init-param> <param-name>...</param-name> <param-value>...</param-value> </init-param>] </filter> <filter-mapping> <!-- νν° μ΄λ¦μ μ€μ --> <filter-name>...</filter-name> <!-- URL ν¨ν΄μ μ€μ --> <url-pattern>...</url-pattern> </filter-mapping>
web.xmlνμΌμ νν° κ΅¬μ±
<init-param></init-param>
- μ€μ λ λ§€κ°λ³μμ κ°μ μλ° or JSP μ½λμμ μ κ·Ό
String value = getServletConfig().getInitParameter("λ§€κ°λ³μμ΄λ¦");
- [
<filter/>
μμ μ¬μ© μμ: νν°μ΄λ¦ myFilterμ ν΄λμ€ μ΄λ¦ LoggingFilter μ€μ ]
<filter> <filter-name>myFilter</filter-name> <filter-class>ch12.com.filter.LoggingFilter</filter-class> </filter>
- [
<filter/>
μμ μ¬μ© μ: paramκ³Ό κ° admin μ€μ ]
<filter> <filter-name>Myfilter</filter-name> <filter-class>ch12.com.filter.LoggingFilter</filter-class> <init-param> <param-name>param</param-name> <param-value>admin</param-value> </init-param> </filter>
<filter-mapping></filter-mapping>
- νΉμ 리μμ€μ λν΄ μ΄λ€ νν°λ₯Ό μ¬μ©ν μ§ μ€μ νλ λ° μ¬μ©
<filter-mapping> <filter-name>νν° μ΄λ¦</filter-name> <url-pattern>μμ² URL ν¨ν΄</url-pattern> </filter-mapping>
- [
<filter-mapping/>
μμ μ¬μ© μ: URL ν¨ν΄μ /*λ‘ μ€μ ]
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- [
<filter-mapping/>
μμ μ¬μ© μ: URL ν¨ν΄μ /ch12/filter.jspλ‘ μ€μ ]
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/ch12/filter.jsp</url-pattern> </filter-mapping>
-
νν°λ‘ form νμ΄μ§μμ μ μ‘λ μμ² νλΌλ―Έν° μ²λ¦¬
- JSPBook/src/ch12/com/filter/AuthenFilter.java
public class AuthenFilter implements Filter{
@Override
public void init(FilterCOnfig filterConfing) throws ServletException{
System.out.println("Filter01 μ΄κΈ°ν");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException{
System.out.println("Filter01.jsp μν...");
String name = request.getParameter("name");
if (name == null || name.equals("")){
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
String message = "μ
λ ₯λ name κ°μ null μ
λλ€.";
writer.println(message);
return;
}
filterChain.doFilter(request,response);
}
@Override
public void destroy(){
System.out.println("Filter01 ν΄μ ...");
}
}
- JSPBook/WebContent/WEB-INF/web.xml
<web-app>
...
<filter>
<filter-name>Filter01</filter-name>
<filter-class>ch12.com.filter.AuthenFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter01</filter-name>
<url-pattern>/ch12/filter01_process.jsp</url-pattern>
</filter-mapping>
</web-app>
- JSPBook/WebContent/ch12/filter01.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>Filter</title>
</head>
<body>
<form method="post" action="filter01_process.jsp">
<p>
μ΄λ¦: <input type="text" name="name"/>
</p>
<input type="submit" value="μ μ‘"/>
</form>
</body>
</html>
3. λνΌ ν΄λμ€
λνΌ ν΄λμ€λ?
- λνΌν΄λμ€(wrapper class) λ κΈμ κ·Έλλ‘ ν¬μ₯νλ μν μ νλ ν΄λμ€
- λνΌ ν΄λμ€μ μ’
λ₯
- μμ² κ°μ²΄λ₯Ό ν¬μ₯νλ μμ² λνΌ ν΄λμ€
- μλ΅ κ°μ²΄λ₯Ό ν¬μ₯νλ μλ΅ λνΌ ν΄λμ€
- λ μ’
λ₯μ λνΌ ν΄λμ€λ κ°κ° λ€μμ λ ν΄λμ€λ₯Ό μμνμ¬ μμ±
- javax.servlet.http.HttpServletRequestWrapper ν΄λμ€
- javax.servlet.http.HttpServletResponseWrapper ν΄λμ€
μμ² λνΌ ν΄λμ€
- μμ² λνΌ ν΄λμ€λ₯Ό μμ±νλ λ°©λ²
- μμ² λνΌ ν΄λμ€λ HttpServletRequestWrapper ν΄λμ€λ₯Ό μμλ°μμΌ νλ―λ‘ λ€μκ³Ό κ°μ 골격μ λ§λλκ²μΌλ‘ ν΄λμ€ μμ± μμ
public class MyRequestWrapper extends HttpServletRequestWrapper{ ... }
- μμ² λνΌ ν΄λμ€μ κ°μ₯ κΈ°λ³Έμ μΈ μν μΈ μμ² κ°μ²΄λ₯Ό ν¬μ₯νλ μΌμ μμ±μλ₯Ό ν΅ν΄ μν
- μμ² κ°μ²΄λ₯Ό νλΌλ―Έν°λ‘ λ°λ μμ±μλ₯Ό μ μΈνκ³ , κ·Έ μμμ νλΌλ―Έν° κ°μ νλ(field, ν΄λμ€μ λ§΄λ²λ³μ)μ μ μ₯
public class MyrequestWrapper extends HttpServletREquestWrapper{ private HttpServletRequest request; public MyRequestWrapper(HttpServletRequest request){ this.request = request; } }
- μμ² λνΌ ν΄λμ€μ μμ±μ μμμλ λ°λμ HttpServletRequestWrapper ν΄λμ€μ μμ±μλ₯Ό νΈμΆν΄μΌ νκ³ , μμ² κ°μ²΄λ₯Ό νλΌλ―Έν°λ‘ λ겨μ€μΌ ν¨
public class MyRequestWrapper extends HttpServletRequestWrapper{ private HttpServletRequest request; public MyRequestWrapper(HttpServletRequest request){ super(request); this.request = request; } }
- μμ² λ°μ΄ν°λ₯Ό λ³ννλ μΌμ μΉ μ»΄ν¬λνΈκ° μ
λ ₯ λ°μ΄ν°λ₯Ό κ°μ Έμ¬λ νΈμΆνλ λ©μλμ λκ°μ μκ·Έλμ²μ λ©μλλ₯Ό λ§λ€μ΄μ κ·Έ μμμ μν
- λμ€μ μΉ μ»΄ν¬λνΈλ μ λ ₯ λ°μ΄ν°λ₯Ό κ°μ Έμ€κΈ° μν΄ μ΄ λ©μλλ₯Ό νΈμΆνκ³ , κ·Έ κ²°κ³Ό λ³νλ λ°μ΄ν°λ₯Ό λ°κ² λ¨
public class MyRequestWrapper extends HttpServletRequestWrapper{ ... public String getParameter(String name){ // μ΄κ³³μ HTML λ¬Έμμ form μ리먼νΈλ₯Ό ν΅ν΄ μ λ ₯λ λ°μ΄ν°λ₯Ό λ³ννλ μ½λ } }
- μμ² λ°μ΄ν°λ₯Ό λ³ννλ λ©μλλ μΉ μ»΄ν¬λνΈμ κΈ°λμ λ§μΆμ΄μ μ μ
- ex) getParameter λ©μλλ μ λ ₯ λ°μ΄ν° μ΄λ¦μ νλΌλ―Έν°λ‘ λ°κ³ , κ·Έμ ν΄λΉνλ λ°μ΄ν° κ°μ 리ν΄
public class MyRequestWrapper extends HttpServletRequestWrapper{ ... public String getParameter(String name){ // μ΄κ³³μ HTML λ¬Έμμ form μ리먼νΈλ₯Ό ν΅ν΄ μ λ ₯λ λ°μ΄ν°λ₯Ό λ³ννλ μ½λ String value = request.getParameter(name); String newValue = value.getUpperCase(); return newValue; } }
- νν° ν΄λμ€μ doFilter λ©μλ μμμλ μμ² κ°μ²΄λ₯Ό μμ² λνΌ κ°μ²΄ λ°κΎΈλ μΌκ³Ό, κ·Έ μμ² λνΌ κ°μ²΄λ₯Ό κ°μ§κ³ chain.doFilter λ©μλλ₯Ό νΈμΆνλ μμ μν
public class MyFilter implements Filter{ ... public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)...{ MyRequestWrapper requestWrapper = new MyRequestWrapper((HttpServletRequest) request); chain.doFilter(requestWrapper, response); } }
μλ΅ λνΌ ν΄λμ€
- μλ΅ λνΌ ν΄λμ€λ₯Ό μμ±νλ λ°©λ²
- μλ΅ λνΌ ν΄λμ€λ λ€μκ³Ό κ°μ΄ HttpServletResponseWrapper ν΄λμ€λ₯Ό μμ νλλ‘ ν¨
public class MyResponseWrapper extends HttpServletResponseWrapper{ ... }
-
μλ΅ λνΌ ν΄λμ€λ μμ² λνΌ ν΄λμ€μ λ§μ°¬κ°μ§λ‘ μμ±μ μμμ μνΌ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνκ³ , μλ΅ κ°μ²΄λ₯Ό ν¬μ₯νλ μΌ μν
public class MyResponseWrapper extends HttpServletResponseWrapper{ HttpServletResponse response; public ParamUpperCaseResponseWrapper(HtppServletResponse response){ super(response); this.response = response; } }
λκΈλ¨κΈ°κΈ°