카테고리 없음

Jsp filter

chanwoo23 2025. 4. 8. 17:06
@WebServlet("/filter/*")
public class F_filter extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        
        String url = req.getRequestURI();
        String[] urlArr = url.split("/");
        
        switch (urlArr[urlArr.length - 1]) {
            case "error":
                throw new CommonException("Exception test");
            case "path":
                path(req, resp);
                break;
            default:
                resp.setStatus(404);
        }
    }
    
    private void path(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        
        PathWrapper pathWrapper = (PathWrapper) req;
        RequestDispatcher dispatcher = req.getRequestDispatcher("study/e_filter");
        
        System.out.println(pathWrapper.getWrappedPath());
        dispatcher.forward(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

📄 클래스 요약

@WebServlet("/filter/*")
public class F_filter extends HttpServlet {
  • 이 서블릿은 /filter/로 시작하는 모든 요청을 처리합니다.
  • 예: /filter/path, /filter/error 등이 이 서블릿으로 들어오게 됩니다.

🔍 핵심 흐름 요약

String url = req.getRequestURI();
String[] urlArr = url.split("/");
  • URI를 / 기준으로 쪼개서 마지막 경로를 보고 분기합니다.
switch (urlArr[urlArr.length - 1]) {
    case "error":
        throw new CommonException("Exception test");
    case "path":
        path(req, resp);
        break;
    default:
        resp.setStatus(404);
}
  • /filter/error 요청 → 일부러 예외 발생 → 예외 처리 필터 테스트용
  • /filter/path 요청 → path() 메서드 실행
  • 나머지는 404

✅ path() 메서드 분석

private void path(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    
    PathWrapper pathWrapper = (PathWrapper) req;
    RequestDispatcher dispatcher = req.getRequestDispatcher("study/e_filter");

    System.out.println(pathWrapper.getWrappedPath());
    dispatcher.forward(req, resp);
}

🔹 1. PathWrapper로 다운캐스팅

  • HttpServletRequest → PathWrapper로 형변환하는 부분이 핵심입니다.
  • 즉, 이 요청 객체는 어딘가에서 필터나 래퍼를 통해 PathWrapper로 감싸졌다는 뜻입니다.
  • → b_filter.wrapper.PathWrapper는 HttpServletRequestWrapper일 가능성이 큽니다.

✅ 이 구조는 "필터에서 요청 객체를 감싼(wrap) 상태로 넘겨줬다"는 뜻입니다.


🔹 2. Dispatcher forward

RequestDispatcher dispatcher = req.getRequestDispatcher("study/e_filter");
dispatcher.forward(req, resp);
  • 요청을 "study/e_filter" 라는 JSP 또는 서블릿으로 forward합니다.
  • 즉, 현재 요청/응답은 계속 이어지고 있고, 브라우저는 URL을 /filter/path로 유지한 채 화면을 받게 됩니다.

🔹 3. 콘솔 출력

System.out.println(pathWrapper.getWrappedPath());
  • PathWrapper 클래스 안에서 추가로 로깅하거나 가공된 경로 정보를 가져오는 구조입니다.

💡 전체 요청 흐름 요약

[브라우저 요청: /filter/path]
    ↓
[F_filter 서블릿 실행]
    ↓
[HttpServletRequest는 필터에서 PathWrapper로 감싸져 있음]
    ↓
[dispatcher.forward → study/e_filter.jsp 실행]
    ↓
[JSP가 사용자에게 HTML 응답]

✅ 이 코드에서 "필터 역할"은 무엇이었을까?

  • 필터는 코드 상에 없지만, 요청 객체가 PathWrapper인 걸 보면 다음과 같은 필터가 있을 겁니다:
public class PathWrappingFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

        PathWrapper wrappedRequest = new PathWrapper((HttpServletRequest) request);
        chain.doFilter(wrappedRequest, response);
    }
}

이런 식으로 요청을 가공(wrap)해서 넘겨주면, 서블릿에서 PathWrapper 기능을 사용할 수 있는 구조입니다.


✅ JSP와의 관계는?

  • 이 서블릿은 study/e_filter.jsp 같은 JSP를 forward로 호출합니다.
  • 그 JSP는 request.getAttribute()나 ${}로 PathWrapper가 세팅한 값을 출력할 수 있습니다.

🔚 결론 요약

구성 요소역할
@WebServlet("/filter/*") 서블릿 매핑
path() PathWrapper에서 경로 정보 출력, JSP로 forward
PathWrapper 요청 객체 확장 – 필터에서 wrapping 되었을 것
RequestDispatcher.forward() JSP로 연결 (URL 유지, request 유지)
JSP (study/e_filter) 최종 응답 렌더링 담당