필터란
https://dololak.tistory.com/602 참고
Filter 인터페이스
package javax.servlet;
import java.io.IOException;
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
defulat public void init(FilterConfig filterConfig)
웹컨테이너(톰캣)이 시작될 때 필터 객체를 생성하는데,
이때 객체가 생성되면서 최초에 한 번 호출되는 메서드입니다.
FilterConfig 객체를 넘겨주기 때문에 이를 통해 여러가지 설정값을 넘겨받을 수 있고
필터에서 처리시 필요한 객체등을 초기화(예를들어 JDBC 커넥션 등) 하는데 사용됩니다.
default public void destroy()
필터 객체가 제거될 때 실행되는 메서드입니다.
보통 초기화시 생성했던 자원들을 종료하는 기능에 사용됩니다.
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
필터의 핵심 메서드입니다.
doFilter()는 클라이언트의 요청이 있을때마다 매번 실행됩니다.
ServletRequest와 ServletResponse 객체를 넘겨주기 때문에
이를 가지고 요청과 응답을 조작할 수 있습니다.
그리고 FilterChain을 통해 조작 이후 요청을 원래 목적지인 서블릿으로 전달 할 수 있습니다.
필터 적용
Filter 인터페이스를 상속받으면 된다.
doFilter만 필수로 오버라이딩해주고, init()과 destory()는 필요에 따라 오버라이딩 하면 된다.
LoginCheckFilter.java
@WebFilter("/myPage/*") //web.xml에 필터 등록 대신
public class LoginCheckFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
HttpSession session=req.getSession();
UserVO user=(UserVO)session.getAttribute("USER_INFO");
if(user==null) {
resp.sendRedirect(req.getContextPath()+"/login/login.wow");
}else {
chain.doFilter(request, response);
}
//로그인을 session으로 구현한 경우 HttpServletRequest로 형변환 해줘야 한다.
}
}
@WebFilter 를 사용하지 않고 web.xml에 필터를 등록할 수도 있다.
<filter>
<filter-name>loginCheck</filter-name>
<filter-class>패키지명.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginCheck</filter-name>
<url-pattern>/mypage/*</url-pattern>
</filter-mapping>
URL패턴은 다음 중 하나를 선택해서 작성한다
- '*. something' : 확장자 매핑, 확장자가 something으로 끝나는 모든 요청에 해당한다.
- '/something/*': 경로 매핑, 요청경로가 /something/으로 시작하는 모든 요청에 해당한다.
- '/' : 기본매핑, 확장자매핑과 경로매핑에 해당하지않으면 기본매핑에 해당한다.
- '/*' : 절대값 매핑, 모든 요청에 해당한다