아래 항목들을 순서대로 점검·수정해 보세요.
현재 여러분의 필터 클래스들은 auth.servlet 패키지에 들어 있는데, web.xml 에는 ex0415.filter.LogFilter 가 매핑되어 있습니다.
둘 중 하나를 골라 일치시켜야 합니다.
web.xml 쪽을 고친다<filter>
<filter-name>LogFilter</filter-name>
<filter-class>auth.servlet.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>auth.servlet.AuthenticationCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/login/LoginOk.jsp</url-pattern>
</filter-mapping>
ex0415.filter 로 바꾼다package ex0415.filter;
// … 이하 소스 동일 …
Tip: 어노테이션(
@WebFilter)과web.xml중복 매핑이 있으면 어노테이션이 우선이니, 둘 중 하나만 남기세요.
package auth.servlet; // ← web.xml 고친다면 ex0415.filter 로 바꿀 것
import java.io.IOException;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@WebFilter("/*") // web.xml만 쓴다면 삭제
public class LogFilter implements Filter {
private static final Log log = LogFactory.getLog(LogFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.debug("LogFilter 초기화");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
long start = System.currentTimeMillis();
chain.doFilter(req, res);
long duration = System.currentTimeMillis() - start;
String clientIp = request.getRemoteAddr();
String uri = request.getRequestURI();
log.debug(String.format("IP=%s, URI=%s, 처리시간=%dms", clientIp, uri, duration));
}
@Override
public void destroy() {
log.debug("LogFilter 종료");
}
}
package auth.servlet; // ← web.xml 고친다면 ex0415.filter 로 바꿀 것
import java.io.IOException;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
@WebFilter("/login/LoginOk.jsp") // web.xml만 쓴다면 삭제
public class AuthenticationCheckFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("sessionId") == null) {
request.setAttribute("errorMsg", "인증하고 이용하세요.");
request.getRequestDispatcher("/error/errorPage.jsp")
.forward(request, response);
return;
}
chain.doFilter(req, res);
}
@Override
public void destroy() { }
}
logback.xml 위치 & 내용 수정src/main/resources/logback.xml (또는 WEB‑INF/classes/logback.xml) <!-- 예: auth.servlet 패키지 로깅 -->
<logger name="auth.servlet" level="DEBUG" />web.xml 필터‑클래스 이름이 일치하는가 @WebFilter 와 web.xml 중복 매핑은 제거했는가 logback.xml 이 클래스패스 상에 올라가 있는가 logback.xml 의 <logger name="…"> 가 실제 필터 패키지와 일치하는가 이제 서버를 재시작하면
LogFilter 의 DEBUG 로그가 콘솔·파일에 찍히고 /login/LoginOk.jsp 접근 시 인증 검사 필터가 동작할 것입니다.