본문 바로가기

대덕공부/Spring

Filter

필터란?

- 필터는 “HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 코드”이다.
 - 필터는 객체의 형태로 존재하며 클라이언트로부터 오는 요청(request)과 최종 자원(서블릿/JSP/기타 문서) 사이에 위치하여 클라이언트의 요청 정보를 알맞게 변경할 수 있으며, 또한 필터는 최종 자원과 클라이언트로 가는 응답 (response) 사이에 위치하여 최종 자원의 응답 결과를 알맞게 변경할 수 있다.

 

 

 

 

 

 

 

Decorating Filter Pattern

1. 필터는 비지니스 로직이 해야할일을 대신하지않으며 있어도 되지만 없어도됨 

2.재사용가능한 객체 형태로 이용 16바이트 

3. 필터를 필요하다면 여러개를 만들어 줌 was는 그걸로 필터체인을 형성하고, 각각의 필터는 필터순서를 가진다.

4. 데코래이팅이 가장핵심이다. 필터는 핵심구성이 아니다. 악세사리라고 생각하면됨.

 

세개의 콜백메소드를 가지고있다. 

WAS에서 필터를 사용함으로 WAS는 webcontainer , servletcontainer -> javax.servlet 상속받는다.

롬복가지고있으면 자동으로 만들어줌

 

private static final Logger log = LoggerFactory.getLogger(SampleFilter.class);  == @Slf4j

**was가 필터를 사용하려고 등록할때필터체인이 만들어진다. 

 

web.xml에 리스너와 서블릿사이에 등록해준다.

 

Examples that have been identified for this design are:

  1. Authentication Filters
  2. Logging and Auditing Filters
  3. Image conversion Filters
  4. Data compression Filters
  5. Encryption Filters
  6. Tokenizing Filters
  7. Filters that trigger resource access events
  8. XSL/T filters
  9. Mime-type chain Filter

-> 없어도 그만인게 공통점 

<filter>
<filter-name>SampleFilter</filter-name>
<filter-class>kr.or.ddit.filter.SampleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SampleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>SampleFilter2</filter-name>
<filter-class>kr.or.ddit.filter.SampleFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>SampleFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 

utf-8 서블릿에서 삭제해줌 -> 왜? 필터를 사용했으니깐 

<filter>
		<filter-name>FilterConfig</filter-name>
		<filter-class>javax.servlet.FilterConfig</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>FilterConfig</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

redirect로 가면 계속 필터를사용하면서 계속이동하기때문에 페이지가 작동하지않음

 

 

package kr.or.ddit.filter;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.Filter;
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;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 블라인드 처리의 대상이 되는 사용자가 접속한 경우 해당 요청에 대해 직접 처리하지 말고, 접근 불가 메시지 페이지로 연결함.
 * 
 * @author 306-25
 *
 */
public class BlindFilter implements Filter {

	private Map<String, String> blindTarget;

	public void init(FilterConfig fConfig) throws ServletException {
		blindTarget = new LinkedHashMap<>();

		// IP, reason
		blindTarget.put("192.168.36.35", "나니깐 블라인드");
		blindTarget.put("192.168.36.19", "정현이니깐 블라인드");

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 통과를시킬지말지 결정 , 블라인드타겟에 포함되었는지안되었는지 현재 클라이언트 아이피를 잡고 그 아이피가 블라인드타겟에 포함되어잇으면 통과
		// 안시킴

		HttpServletRequest req = (HttpServletRequest) request;
		// 1. IP확보
		String ip = req.getRemoteAddr();
		String uri = req.getRequestURI();
		boolean pass = uri.endsWith("/errors/blindError.jsp");

		// 2. 블라인드 대상자 여부결정
		boolean blind = !pass && blindTarget.containsKey(ip);

		if (blind) {
			//3. 대상자 blind error 
			Map<String, String> target = new HashMap<>();
			target.put("IP", ip);
			target.put("reason", blindTarget.get(ip));
			req.getSession().setAttribute("target", target);
			String goPage = "/errors/blindError.jsp";
			((HttpServletResponse)response).sendRedirect(req.getContextPath()+goPage);
		} else {
			//비대상자 :통과
			chain.doFilter(request, response);
		}
	}

	public void destroy() {

	}

}

pass 씀으로서 계속 redirect 되는걸 막음 ->왜냐면 endsWith로 설정해준 해당값으로 끝나면 못움직이게 막아놨으니깐 redirect로 검증후 이동 완료 

 

 

'대덕공부 > Spring' 카테고리의 다른 글

보안프레임워크2  (0) 2022.07.06
WAS와 Server의 차이? 그리고 Web Container 란?  (0) 2022.07.05
log4j  (0) 2022.07.05
iBatis - Pagination 페이지 + 검색기능  (0) 2022.06.30
IBatis - PROD 부분 만들어보기 (1)Select  (0) 2022.06.29