필터란?
- 필터는 “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:
- Authentication Filters
- Logging and Auditing Filters
- Image conversion Filters
- Data compression Filters
- Encryption Filters
- Tokenizing Filters
- Filters that trigger resource access events
- XSL/T filters
- 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>
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 |