Java Filter 필터 상세 설명 및 인스턴스 코드

12375 단어 JavaFilter여과기
Filter 소개
필터라고도 하는데 이것은 Servlet 기술 중 가장 실용적인 기술이다. WEB 개발자는 Filter 기술을 통해 웹 서버가 관리하는 모든 웹 자원: 예를 들어 Jsp, Servlet, 정적 이미지 파일이나 정적 html 파일 등을 차단하여 특수한 기능을 실현한다.예를 들어 URL 수준의 권한 접근 제어, 민감한 어휘 필터링, 응답 정보 압축 등 고급 기능을 실현한다.
이것은 주로 사용자 요청을 미리 처리하거나 HttpServletResponse를 사후 처리하는 데 사용됩니다.Filter의 전체 프로세스를 사용합니다: Filter는 사용자 요청을 미리 처리한 다음 Servlet에 요청을 처리하고 응답을 생성합니다. 마지막으로 Filter는 서버 응답을 처리합니다.
Filter 기능
1. HttpServletRequest가 Servlet에 도착하기 전에 고객의 HttpServletRequest를 차단합니다.필요에 따라 HttpServletRequest를 검사하거나 HttpServletRequest 헤더와 데이터를 수정할 수 있습니다.
2. HttpServletResponse가 클라이언트에 도착하기 전에 HttpServletResponse를 차단합니다.필요에 따라 HttpServletResponse를 검사하거나 HttpServletResponse 헤더와 데이터를 수정할 수 있습니다. 
Filter 를 통한 차단 방법
Filter 인터페이스에 doFilter 방법이 있습니다. 개발자가 Filter를 작성하고 어느 웹 자원을 차단하는지 설정한 후에 WEB 서버는 웹 자원의 서비스 방법을 호출하기 전에 Filter의 doFilter 방법을 호출합니다. 따라서 이 방법에서 코드를 작성하면 다음과 같은 목적을 달성할 수 있습니다.
1. 목표 자원을 호출하기 전에 코드를 실행합니다.
2. 대상 자원을 호출할지 여부(즉 사용자가 웹 자원에 접근하도록 할지 여부).
웹 서버는 DoFilter 방법을 호출할 때 FilterChain 대상을 전달합니다. FilterChain 대상은 filter 인터페이스에서 가장 중요한 대상입니다. 또한 DoFilter 방법을 제공합니다. 개발자는 수요에 따라 이 방법을 호출할지 여부를 결정할 수 있습니다. 이 방법을 호출하면 웹 서버는 웹 자원의 서비스 방법을 호출합니다. 즉, 웹 자원이 방문되지 않으면 웹 자원이 방문하지 않습니다.
Filter 개발 2단계
자바 클래스를 작성하여 Filter 인터페이스를 실현하고doFilter 방법을 실현합니다.
웹에서xml 파일에서 사용과 요소가 작성된 필터 클래스를 등록하고 차단할 수 있는 자원을 설정합니다.
web.xml 설정 노드 소개:
  • 필터 지정..
  • 은 필터의 이름을 지정하는 데 사용되며, 이 요소의 내용은 비어 있을 수 없습니다
  • 요소는 필터의 완전한 한정 클래스 이름을 지정하는 데 사용됩니다
  • 요소는 필터에 초기화 파라미터를 지정하는 데 사용되며, 하위 요소 파라미터의 이름, 파라미터의 값을 지정합니다
  • 필터에서 FilterConfig 인터페이스 객체를 사용하여 초기화 매개변수에 액세스할 수 있습니다
  • 요소는 Filter가 차단하는 자원을 설정하는 데 사용됩니다.Filter 차단 리소스는 두 가지 방법으로 지정할 수 있습니다: Servlet 이름과 리소스 액세스 요청 경로
  • 하위 요소는 filter의 등록 이름을 설정하는 데 사용됩니다.이 값은 요소에 표시된 필터의 이름이어야 합니다
  • 필터가 차단하는 요청 경로(필터 관련 URL 스타일)를 설정합니다
  • 필터가 차단하는 Servlet 이름을 지정합니다.
    필터가 차단하는 자원을 Servlet 용기에서 호출하는 방식을 지정합니다. 리퀘스트, 포함, FORWARD 및 ERROR 중 하나입니다. 기본 리퀘스트입니다.사용자는 여러 개의 하위 요소를 설정하여 Filter가 자원에 대한 다양한 호출 방식을 차단하도록 지정할 수 있습니다.
    하위 요소가 설정할 수 있는 값과 의미
  • 리퀘스트: 사용자가 직접 페이지에 접근할 때 웹 용기에서 필터를 호출합니다.대상 리소스가 RequestDispatcher의 include () 또는 forward () 방법으로 액세스하는 경우 필터가 호출되지 않습니다
  • INCLUDE: 대상 리소스가 RequestDispatcher의 include() 방법으로 액세스하는 경우 필터가 호출됩니다.이외에 이 필터는 호출되지 않습니다..
  • FORWARD: 대상 리소스가 RequestDispatcher의 forward () 방법으로 액세스하는 경우 이 필터는 호출되며 그 외에는 호출되지 않습니다
  • ERROR: 대상 자원이 성명식 이상 처리 메커니즘을 통해 호출되면 이 필터가 호출됩니다.그 외에는 필터가 호출되지 않습니다..
  • 필터 체인
    하나의 웹 응용 프로그램에서 여러 개의 Filter를 개발하고 작성할 수 있는데, 이 Filter를 조합하여 하나의 Filter 체인이라고 부른다.
    웹 서버는 Filter에 따라 웹에 있습니다.xml 파일의 등록 순서는 어떤 Filter를 먼저 호출할지 결정합니다. 첫 번째 Filter의doFilter 방법이 호출될 때 웹 서버는 Filter 체인을 대표하는 FilterChain 대상을 만들어서 이 방법에 전달합니다.DoFilter 방법에서 개발자가 FilterChain 대상의 DoFilter 방법을 호출하면 웹 서버는 FilterChain 대상에 Filter가 있는지 확인하고 있다면 두 번째 Filter를 호출하고 없으면 목표 자원을 호출합니다.
    Filter 라이프 사이클
    
    public void init(FilterConfig filterConfig) throws ServletException;// 
    우리가 작성한 Servlet 프로그램과 마찬가지로 Filter 생성 및 제거는 WEB 서버에서 담당합니다.웹 응용 프로그램이 시작되면 웹 서버는 Filter의 실례 대상을 만들고 init 방법을 호출하여 웹을 읽습니다.xml 설정, 대상의 초기화 기능을 완성하여 후속 사용자의 요청을 차단하는 준비 작업(filter 대상은 한 번만 만들 수 있고 init 방법도 한 번만 실행할 수 있습니다).개발자는 init 방법의 매개 변수를 통해 현재 filter 설정 정보를 대표하는 FilterConfig 대상을 얻을 수 있습니다.
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;// 
    
    이 방법은 실제 여과 조작을 완성한다.고객이 필터와 연결된 URL에 대한 액세스를 요청하면 Servlet 필터는 doFilter 방법을 먼저 실행합니다.FilterChain 매개변수는 후속 필터에 액세스하는 데 사용됩니다.
    
    public void destroy();// 
    Filter 대상이 생성되면 메모리에 머무르며 웹 응용 프로그램이 제거되거나 서버가 정지될 때 삭제됩니다.웹 컨테이너에서 Filter 객체를 마운트 해제하기 전에 호출됩니다.이 메서드는 Filter 라이프 사이클에서 한 번만 수행됩니다.이 방법에서는 필터에 사용되는 자원을 방출할 수 있다.
    FilterConfig 인터페이스
    사용자가 filter를 설정할 때 filter에 초기화 파라미터를 설정할 수 있습니다. 웹 용기에서 실례화된 Filter 대상을 사용하고 init 방법을 호출할 때 filter 초기화 파라미터를 봉인한 filterConfig 대상을 전달합니다.따라서 개발자는 filter를 작성할 때 filterConfig 대상을 통해 다음과 같은 내용을 얻을 수 있다.
    
    String getFilterName();// filter 。 
    String getInitParameter(String name);// 。 null. 
    Enumeration getInitParameterNames();// 。 
    public ServletContext getServletContext();// Servlet 。
    Filter 사용 사례
    Filter 를 사용하여 사용자 로그인 보안 제어 확인
    얼마 전에 프로젝트 유지보수에 참여했고 사용자가 시스템을 종료한 후에 주소 표시줄에 가서 역사를 방문하면 url에 따라 시스템 응답 페이지에 들어갈 수 있습니다.요청을 필터링하지 않은 사용자 로그인을 확인하러 갔습니다.필터를 추가해서 문제를 해결합니다!
    먼저 웹에서.xml 구성
    
    <filter>
     <filter-name>SessionFilter</filter-name>
     <filter-class>com.action.login.SessionFilter</filter-class>
     <init-param>
      <param-name>logonStrings</param-name><!--   -->
      <param-value>/project/index.jsp;login.do</param-value>
     </init-param>
     <init-param>
      <param-name>includeStrings</param-name><!--   -->
      <param-value>.do;.jsp</param-value>
     </init-param>
     <init-param>
      <param-name>redirectPath</param-name><!--   -->
      <param-value>/index.jsp</param-value>
     </init-param>
     <init-param>
      <param-name>disabletestfilter</param-name><!-- Y:  -->
      <param-value>N</param-value><!-- http://www.manongjc.com/article/1613.html -->
     </init-param>
    </filter>
    <filter-mapping>
     <filter-name>SessionFilter</filter-name>
     <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    이어서 FilterServlet을 작성합니다.java:
    
    package com.action.login;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    /**
     *  , 
     * http://www.manongjc.com/article/1613.html 
     */
    public class SessionFilter implements Filter {
    
     public FilterConfig config;
    
     public void destroy() {
      this.config = null;
     }
    
     public static boolean isContains(String container, String[] regx) {
      boolean result = false;
      for (int i = 0; i < regx.length; i++) {
       if (container.indexOf(regx[i]) != -1) {
        return true;
       }
      }
      return result;
     }
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest hrequest = (HttpServletRequest)request;
      HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
    
      String logonStrings = config.getInitParameter("logonStrings");  //  
      String includeStrings = config.getInitParameter("includeStrings"); //  
      String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");//  
      String disabletestfilter = config.getInitParameter("disabletestfilter");//  
    
      if (disabletestfilter.toUpperCase().equals("Y")) { //  
       chain.doFilter(request, response);
       return;
      }
      String[] logonList = logonStrings.split(";");
      String[] includeList = includeStrings.split(";");
    
      if (!this.isContains(hrequest.getRequestURI(), includeList)) {//  
       chain.doFilter(request, response);
       return;
      }
    
      if (this.isContains(hrequest.getRequestURI(), logonList)) {//  
       chain.doFilter(request, response);
       return;
      }
    
      String user = ( String ) hrequest.getSession().getAttribute("useronly");// 
      if (user == null) {
       wrapper.sendRedirect(redirectPath);
       return;
      }else {
       chain.doFilter(request, response);
       return;
      }
     }
     public void init(FilterConfig filterConfig) throws ServletException {
      config = filterConfig;
     }
    }
    
    
    이렇게 하면 사용자에 대한 모든 요청을 완성할 수 있으며, 이 Filter를 통해 사용자 로그인을 검증해야 한다.
    중국어 부호 방지 필터
    프로젝트가spring 프레임워크를 사용할 때.현재 JSP 페이지와 JAVA 코드에서 서로 다른 문자 집합을 사용하여 인코딩을 할 때 폼에서 제출한 데이터가 나오거나 중국어 이름 파일을 업로드/다운로드하는 데 오류가 발생하면 이 필터를 사용할 수 있습니다.
    
    <filter>
     <filter-name>encoding</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     <init-param>
      <param-name>encoding</param-name><!-- -->
      <param-value>UTF-8</param-value>
     </init-param>
     <init-param>
      <param-name>forceEncoding</param-name><!--true: request , encoding;false: request , encoding-->
      <param-value>false</param-value>
     </init-param>
    </filter>
    <filter-mapping>
     <filter-name>encoding</filter-name>
     <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    Spring+Hibernate의 OpenSessionInViewFilter 제어 세션 스위치
    hibernate+spring이 함께 사용될 때 lazy=true (로드 지연) 를 설정하면 데이터를 읽을 때 부모 데이터를 읽으면 hibernate는 자동으로 세션을 닫습니다. 그러면 관련 데이터, 하위 데이터를 사용하려면 시스템에서 lazyinit 오류가 발생합니다. 이 때spring에서 제공하는 OpenSession InViewFilter 필터를 사용해야 합니다.
    OpenSession InViewFilter는 request가 모든 페이지를 클라이언트에게 보낼 때까지 세션 상태를 유지하고 요청이 끝난 후에야session을 닫습니다. 이렇게 하면 로드 지연으로 인한 문제를 해결할 수 있습니다.
    참고: OpenSessionInViewFilter 설정은struts2 설정 앞에 쓰십시오.tomcat 용기는 필터를 불러올 때 순서대로 불러옵니다. 설정 파일이 struts2의 필터 설정을 먼저 쓰고 OpenSession InView Filter 필터 설정을 하기 때문에 불러오는 순서로 인해 액션이 데이터를 얻을 때session은spring에 의해 관리되지 않습니다.
    
    <filter><!-- lazy loading enabled in spring -->
     <filter-name>OpenSessionInViewFilter</filter-name>
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
     <init-param>
      <param-name>sessionFactoryBeanName</param-name><!--  。 spring id sessionFactory bean, id sessionFactory, , SessionFactory spring bean。 -->
      <param-value>sessionFactory</param-value>
     </init-param>
     <init-param>
      <param-name>singleSession</param-name><!-- singleSession true, false OpenSessionInView -->
      <param-value>true</param-value>
     </init-param>
    </filter>
    <filter-mapping>
     <filter-name>OpenSessionInViewFilter</filter-name>
     <url-pattern>*.do</url-pattern>
    </filter-mapping>
     
    
    
    Struts2 웹.xml 구성
    프로젝트에서 Struts2를 사용하려면 웹에서도 필요합니다.요청을 캡처하고 Struts2의 Action으로 이동하여 처리하는 xml 설정 필터입니다.
    참고: 2.1.3 이전 Struts2 버전의 경우 필터는 org를 사용합니다.apache.struts2.dispatcher.FilterDispatcher.그렇지 않으면 org를 사용합니다.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.Struts2.1.3부터 ActionContextCleanUp 필터를 폐기하고 StrutsPrepare AndExecute Filter 필터에 해당하는 기능을 포함합니다.
    세 가지 초기화 매개변수 구성:
  • config 매개 변수: 불러올 프로필을 지정합니다.쉼표 분할..
  • actionPackages 매개 변수: Action 클래스가 있는 패키지 공간을 지정합니다.쉼표 분할..
  • configProviders 매개 변수: 사용자 정의 프로필 공급자, ConfigurationProvider 인터페이스 클래스를 실현해야 합니다.쉼표 분할..
  • 
    <!-- struts 2.x filter -->
    <filter>
     <filter-name>struts2</filter-name>
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
     <filter-name>struts2</filter-name>
     <url-pattern>*.do</url-pattern>
    </filter-mapping>
    
    읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기