패키지와 매핑(deployment descriptor)

moon.kick·2025년 4월 18일

아래 항목들을 순서대로 점검·수정해 보세요.


1. 패키지와 매핑(deployment descriptor) 일치시키기

현재 여러분의 필터 클래스들은 auth.servlet 패키지에 들어 있는데, web.xml 에는 ex0415.filter.LogFilter 가 매핑되어 있습니다.
둘 중 하나를 골라 일치시켜야 합니다.

옵션 A) 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>

옵션 B) 자바 클래스의 패키지를 ex0415.filter 로 바꾼다

package ex0415.filter;
// … 이하 소스 동일 …

Tip: 어노테이션(@WebFilter)과 web.xml 중복 매핑이 있으면 어노테이션이 우선이니, 둘 중 하나만 남기세요.


2. 필터 소스(import) 정리 & 예시

2‑1) LogFilter.java

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 종료");
    }
}

2‑2) AuthenticationCheckFilter.java

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() { }
}

3. logback.xml 위치 & 내용 수정

  1. 위치: src/main/resources/logback.xml (또는 WEB‑INF/classes/logback.xml)
  2. 패키지별 레벨을 아래처럼 필터 패키지로 고치세요:
    <!-- 예: auth.servlet 패키지 로깅 -->
    <logger name="auth.servlet" level="DEBUG" />
  3. 전체 예시는 앞서 드린 예제를 참고하세요.

최종 점검

  • 패키지 ↔ web.xml 필터‑클래스 이름이 일치하는가
  • @WebFilterweb.xml 중복 매핑은 제거했는가
  • logback.xml 이 클래스패스 상에 올라가 있는가
  • logback.xml<logger name="…"> 가 실제 필터 패키지와 일치하는가

이제 서버를 재시작하면

  • LogFilter 의 DEBUG 로그가 콘솔·파일에 찍히고
  • /login/LoginOk.jsp 접근 시 인증 검사 필터가 동작할 것입니다.
    잘 안 되면 에러 로그(404, 500 등) 메시지를 복사해 주세요.
profile
@mgkick

0개의 댓글