CodeGym/Java Course/모듈 3/웹 서버 필터

웹 서버 필터

사용 가능

필터 소개

하지만 그게 다가 아닙니다. 정말 서블릿이 그렇게 간단하다고 생각하지 않습니까?

이미 분석한 서블릿 외에도 소위 "유틸리티 서블릿"인 필터 도 있습니다 . 이들은 서블릿과 매우 유사하지만 주된 역할은 서블릿이 요청을 처리하도록 돕는 것입니다.

필터는 비서와 같고 서블릿은 디렉터와 같습니다. 문서가 감독의 책상에 도달하기 전에 비서의 손을 통과합니다. 그리고 감독이 서명하면 예를 들어 이미 발신 서신으로 비서에게 다시 갈 것입니다.

이러한 비서는 디렉터에 대한 일부 요청(예: 스팸)을 거부할 수 있습니다. 또는 그에게 알려진 질문에 대한 표준 답변을 제공하십시오 ( "감독이 제자리에 없습니다"). 등등. 또한 이러한 비서가 여러 명 있을 수 있습니다. 하나는 한 번에 모든 디렉터에 대한 스팸을 필터링할 수 있고 다른 비서는 다른 디렉터 간에 요청을 전송할 수 있습니다.

필터도 같은 방식으로 작동합니다.

유틸리티 서블릿”

클래스 Filter, FilterChain, FilterConfig

필터는 서블릿과 매우 유사하지만 몇 가지 작은 차이점이 있습니다. 고유한 필터를 작성하려면 에서 상속해야 합니다 javax.servlet.Filter.

필터에는 메서드 init()destroy(). 메서드 대신 service()필터에는 doFilter(). 그리고 자체 클래스인 FilterConfig도 있습니다. 필터는 web.xml 파일의 서블릿에 추가되거나 @WebFilter 주석을 통해 추가됩니다.

방법 목록:

행동 양식 설명
1 init(FilterConfig config) 필터 초기화
2 destroy() 필터 언로드
doFilter(ServletRequest , ServletResponse, FilterChain) 요청 처리(필터링)

서블릿과 필터의 차이점은 무엇입니까?

여러 필터가 있을 수 있으며 요청(및 응답)을 순차적으로 처리합니다. 이들은 소위 체인으로 결합되며 이들을 위한 특수 클래스도 있습니다 FilterChain.

메서드에서 요청을 처리한 후 체인에서 다음 필터의 doFilter()메서드를 호출해야 합니다 . doFilter()예:

public class MyFilter implements Filter {

  public void init(FilterConfig arg0) throws ServletException {
  }

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {

      PrintWriter out = resp.getWriter();
      out.print("Adding something before the body of the response");

      chain.doFilter(req, resp); // call the next filter in the chain

      out.print("Adding something after the body of the response");
    }

  public void destroy() {
  }
}

실제로 그렇게 응답 본문을 추가 할 수 없습니다 . 공식적으로 필터와 서블릿은 서로 독립적이며 독립적으로 변경할 수 있습니다. 다른 시간에 다른 개발자가 작성할 수 있습니다. 필터 기능은 서비스 기능일 뿐입니다. 예를 들면 다음과 같습니다.

  • 들어오는 모든 요청(및 응답) 로깅
  • 데이터 압축
  • 데이터 암호화(및 복호화)
  • 데이터 검증 요청
  • 원하는 헤더 추가/제거
  • 리디렉션 요청
  • 액세스 제어(사용자가 로그인했는지 확인)

RequestDispatcher 클래스

때때로 필터가 메소드 내에서 실행되는 동안 doFilter() 다른 서블릿을 호출해야 할 수도 있습니다 . 이를 위해 컨테이너에는 특수 객체가 있습니다 RequestDispatcher.

두 가지 방법으로 얻을 수 있습니다.

  • 개체에서HttpServletRequest
  • 개체에서ServletContext

이 개체는 기존 요청을 다른 서블릿으로 리디렉션하는 데 사용할 수 있습니다 . 예를 들어, 사용자가 승인되지 않은 것으로 밝혀졌고 승인된 페이지를 보여주고 싶습니다. 글쎄, 또는 서버에 오류가 있었고 사용자에게 오류 페이지를 표시하고 싶습니다 :)

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)  throws Exception {
           String path = "/error.html";
           ServletContext servletContext = this.getServletContext();
           RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
           requestDispatcher.forward(request, response);
    }
}

RequestDispatcher필터에서 호출할 수도 있습니다 .

public class MyFilter implements Filter {

  public void init(FilterConfig arg0) throws ServletException {
  }

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
           String path = "/error.html";
           ServletContext servletContext = req.getServletContext();
           RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
           requestDispatcher.forward(req, resp);
    }

  public void destroy() {
  }
}

요청은 메서드에서 처리되며 사용 후 forward()호출할 필요가 없습니다 .doFilter()RequestDispatcher

리디렉션과 전달의 비교

그리고 한 가지 더 중요한 점. 사용자를 서블릿의 다른 URI로 리디렉션하려는 경우 두 가지 방법으로 이를 수행할 수 있습니다.

  • redirect
  • forward

이미 분석했지만 편의상 다시 말씀 드리겠습니다.

호출을 통해 리디렉션 하면 서버는 응답 과 지정한 링크를 response.sendRedirect("link")브라우저(클라이언트)로 다시 보냅니다 . 302그리고 브라우저는 서버 응답을 분석한 후 전달한 링크를 다운로드합니다. 즉, 브라우저의 링크가 새 링크로 변경됩니다.

호출을 통해 전달 하면 requestDispatcher.forward()컨테이너 내부에서 새로운 요청이 이루어지고 서블릿은 서블릿의 응답으로 브라우저(클라이언트)에 응답을 보냅니다. 이 경우 브라우저는 새 서블릿에서 응답을 받지만 브라우저의 링크는 변경되지 않습니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다