FOR SW ENGINEERπŸ‘©‍πŸ’»/JSP

JSP - ν•„ν„°(Filter)

μ”¨λ‹ˆ 2021. 12. 15. 20:31
728x90

ν•„ν„°(Filter)

  • HTTP μš”μ²­κ³Ό 응닡을 λ³€κ²½ν•  수 μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ 클래슀.
  • ν•„ν„°λŠ” 객체의 ν˜•νƒœλ‘œ μ‘΄μž¬ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ˜€λŠ” μš”μ²­(request)κ³Ό μ΅œμ’… μžμ› (jsp, servlet λ“±) 사이에 μœ„μΉ˜ν•΄ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 정보 μ•Œλ§žκ²Œ λ³€κ²½ν•  수 있음. λ°˜λŒ€λ‘œ μ΅œμ’… μžμ›κ³Ό ν΄λΌμ΄μ–ΈνŠΈλ‘œ κ°€λŠ” 응닡(response)사이에 μœ„μΉ˜ν•΄ μ΅œμ’… μžμ›μ˜ μš”μ²­ κ²°κ³Ό μ•Œλ§žκ²Œ λ³€κ²½ν•  μˆ˜λ„ 있음.
  • ν•„ν„°μ‚¬μš© ex) JSP/μ„œλΈ”λ¦Ώ 등을 μ‹€ν–‰ν•˜κΈ° 이전에 μš”μ²­μ΄ μ˜¬λ°”λ₯Έμ§€ λ˜λŠ” μžμ›μ— μ ‘κ·Όν•  수 μžˆλŠ” κΆŒν•œμ„ κ°€μ‘ŒλŠ”μ§€ μ—¬λΆ€λ₯Ό 미리 μ²˜λ¦¬ν•  수 있음. JSPλ‚˜ μ„œλΈ”λ¦Ώμ΄ μƒμ„±ν•œ 응닡 데이터 λ³€κ²½ν•˜κ±°λ‚˜μ·¨μ†Œν•  수 μžˆλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•  μˆ˜λ„ 있음.

 

1. ν•„ν„°(filter) μΈν„°νŽ˜μ΄μŠ€

1. public void init(FilterConfig filterConfig) throws ServletException : ν•„ν„° μ΄ˆκΈ°ν™” ν• λ•Œ 호좜됨.

2. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException : ν•„ν„° κΈ°λŠ₯ μˆ˜ν–‰. chainμ΄μš©ν•΄ 체인의 λ‹€μŒ ν•„ν„°λ‘œ 처리λ₯Ό 전달할 수 있음.

3. public void destroy() : ν•„ν„°κ°€ μ›Ή μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‚­μ œλ  λ•Œ ν˜ΈμΆœλœλ‹€.

 

-->ν•„ν„°μ˜ 역할을 ν•˜λŠ” λ©”μ„œλ“œ doFilter() : μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” μ‚¬μš©μžκ°€ νŠΉμ • μžμ›μ„ μš”μ²­ν–ˆμ„ λ•Œ κ·Έ μžμ› 사이에 ν•„ν„°κ°€ μ‘΄μž¬ν•˜λŠ” 경우 ν•„ν„° 객체의 doFilter()λ©”μ„œλ“œλ₯Ό 호좜 , doFilter()λ©”μ„œλ“œλŠ” μš”μ²­μ΄ μžˆμ„ λ•Œλ§ˆλ‹€ 맀번 싀행됨, 

 

2. ν•„ν„° κΈ°λ³Έ ꡬ쑰

- ν•„ν„°λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μžμ› 사이에 μœ„μΉ˜ν•˜κ³  μžˆλ‹€.

- μžμ›μ΄ λ°›λŠ” 정보: ν•„ν„°κ°€ λ³€κ²½ν•œ μš”μ²­μ •λ³΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ λ³΄λŠ” 응닡 정보: ν•„ν„°κ°€ λ³€κ²½ν•œ 응닡 정보

 

3. ν•„ν„° 체인 ꡬ성

- ν•œκ°œμ˜ ν•„ν„°λ§Œ μ‘΄μž¬ν•  수 μžˆλŠ” 것이 μ•„λ‹ˆλ©°, μ—¬λŸ¬κ°œμ˜ ν•„ν„°κ°€ λͺ¨μ—¬ ν•„ν„° 체인(Chain)을 ν˜•μ„±ν•¨. μœ„μ˜ 그림은 ν•„ν„°μ²΄μΈμ˜ ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚Έκ²ƒ.

- μ—¬λŸ¬κ°œμ˜ ν•„ν„°λ₯Ό 거쳐 응닡과 μš”μ²­μ„ λ°›μŒ. (μ •λ³΄λΏλ§Œμ•„λ‹ˆλΌ 흐름도 λ³€κ²½ κ°€λŠ₯)

- 흐름을 λ³€κ²½ν•˜μ—¬, λͺ¨λ“  ν•„ν„°λ₯Ό κ±°μΉ˜μ§€ μ•Šκ³ λ„ ν΄λΌμ΄μ–ΈνŠΈλ‚˜ μžμ›μœΌλ‘œ λ„˜μ–΄κ°ˆ μˆ˜λ„ 있음.

 

4. μ „ν˜•μ μΈ ν•„ν„° κ΅¬ν˜„λ°©λ²•

public class FirstFilter implements Filter{
	
    public void init(FilterConfig filterConfig) throws ServletException{
    	//ν•„ν„° μ΄ˆκΈ°ν™” μž‘μ—…
    }
    
    public void doFilter(ServletRequest request,
    			ServletResponse response,
                	FilterChain chain)
                    throws IOException, ServletException{
    	//1. request 피라미터λ₯Ό μ΄μš©ν•˜μ—¬ μš”μ²­μ˜ ν•„ν„° μž‘μ—… μˆ˜ν–‰
        //Request파라이머 μ΄μš©ν•΄ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ 필터링함.
        
        //2. 체인의 λ‹€μŒ ν•„ν„° 처리
        //Chain.doFilter호좜, μš”μ²­μ˜ 필터링 κ²°κ³Ό λ‹€μŒ 필터에 전달함.
        chain.doFilter(request, response);
        
        //3. responseλ₯Ό μ΄μš©ν•΄ μ‘λ‹΅μ˜ 필터링 μž‘μ—… μˆ˜ν–‰
        //체인을 톡해 μ „λ‹¬λœ 응닡 데이터 λ³€κ²½ν•΄ κ²°κ³Ό ν΄λΌμ΄μ–ΈνŠΈμ— 전솑함.
    }
    
    public void destroy(){
    //주둜 ν•„ν„°κ°€ μ‚¬μš©ν•œ μžμ›μ„ λ°˜λ‚©
    }
}

- ν•„ν„°κ°€ μ‘΄μž¬ν•˜λŠ” 경우, ν•„ν„° κ°μ²΄λŠ” doFilter()λ©”μ„œλ“œ 호좜. doFilter() λ©”μ„œλ“œλŠ” μš”μ²­μ΄ μžˆμ„ λ•Œλ§ˆλ‹€ 맀번 싀행됨.

- doFilter() λ©”μ„œλ“œ λ‚΄ FilterChain을 μ‚¬μš©ν•΄μ„œ ν•„ν„°λŠ” 체인에 μžˆλŠ” λ‹€μŒ 필터에 λ³€κ²½ν•œ μš”μ²­/응닡을 전달할 수 있음.

 

5. ν•„ν„° μ‚¬μš©μ˜ˆμ‹œ

β–Ά web.xmlμ΄μš©ν•΄ ν•„ν„° μ„€μ •

- μ½˜μ†”μ°½μ—μ„œμ˜ 좜λ ₯κ²°κ³Όλ₯Όν†΅ν•΄, f03filter의 doFilterλ₯Ό ν†΅κ³Όν–ˆμŒμ„ ν™•μΈν• μˆ˜ 있음

- <filter>νƒœκ·Έ : μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•  ν•„ν„° μ§€μ •

- <filter-mapping>νƒœκ·Έ : νŠΉμ • μžμ›μ— λŒ€ν•΄ μ–΄λ–€ ν•„ν„°λ₯Ό μ‚¬μš©ν• μ§€ μ§€μ •.

 

β–Ά@WebFilterμ• λ…Έν…Œμ΄μ…˜ μ‚¬μš© & Servletλ™μ‹œ μ‚¬μš© μ˜ˆμ‹œ

- Servlet이 μš”μ²­κ²°κ³Ό 처리 μ „ Filterλ₯Ό κ±°μΉœλ‹€λŠ” 것을 λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œ

filter
Servlet

 

6. μ—¬λŸ¬κ°œμ˜ μ„œλΈ”λ¦Ώκ³Ό, μ—¬λŸ¬κ°œμ˜ ν•„ν„°

- ν•˜λ‚˜μ˜ ν•„ν„°λ₯Ό 거쳐 μ—¬λŸ¬κ°œμ˜ μ„œλΈ”λ¦ΏμœΌλ‘œ 이동할 수 있고,

web.xml을톡해 filter μ„€μ •
filterμ½”λ“œ
/filterex2/s01 첫번째 μ„œλΈ”λ¦Ώ
/filterex2/s01 λ‘λ²ˆμ§Έ μ„œλΈ”λ¦Ώ

 

- μ—¬λŸ¬κ°œμ˜ ν•„ν„°λ₯Ό 거쳐 ν•˜λ‚˜μ˜ μ„œλΈ”λ¦ΏμœΌλ‘œ 이동할 수 있음.

Web.xml톡해 ν•„ν„° μ„€μ •
/filterex3 경둜둜 ν†΅ν•˜λŠ” 첫번쨰 ν•„ν„°
/filterex3 경둜둜 ν†΅ν•˜λŠ” λ‘λ²ˆμ¨° ν•„ν„°
/filter03을 κ±°μΉ˜λŠ” λ‘κ°œμ˜ filerλ₯Ό κ±°μΉ˜λŠ” Servlet

 

7. 캐릭터 인코딩 ν•„ν„°

- κΈ°λ³Έ JSPμ—μ„œμ˜ 인코딩 μ½”λ“œ

<% request.setCharacterEncoding("utf-8"); %>

 

- Filterμ—μ„œμ˜ 인코딩 μ½”λ“œ

public class CharacterEncodingFilter implements Filter{
	private String encoding;
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    		throws IOException, ServletException{
       //setCharacterEncoding()λ©”μ„œλ“œ μ΄μš©ν•΄ μš”μ²­ 캐릭터 인코딩 μ„€μ •
       req.setCharacterEncoding(encoding);
       chain.doFilter(req, res);
    }
    
    @Override
    public void init(FilterConfig config) throws ServletException{
    	//"encoding" μ΄ˆκΈ°ν™” νŒŒλΌλ―Έν„°λ₯Ό μ΄μš©ν•΄ μ„€μ •.
    	encoding = config.getInitParameter("encoding");
        if(encoding == null){
        	encoding = "UTF-8";
        }
    }
    
    @Override
    public void destroy(){
    }
}

web.xml에 μœ„κ°™μ€ 섀정도 μΆ”κ°€

 

728x90