카테고리 없음
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 {
public class F_filter extends HttpServlet {
- 이 서블릿은 /filter/로 시작하는 모든 요청을 처리합니다.
- 예: /filter/path, /filter/error 등이 이 서블릿으로 들어오게 됩니다.
🔍 핵심 흐름 요약
String url = req.getRequestURI();
String[] urlArr = url.split("/");
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);
}
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);
}
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);
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 응답]
↓
[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);
}
}
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) | 최종 응답 렌더링 담당 |