Filter 설명, 실행 순서, 인스턴스

29036 단어 filter
Filter 소개
"Filter는 서브렛의""변종""으로 간주할 수 있으며, 주로 사용자 요청을 사전 처리하거나 Http서브렛 Response를 후처리하는 데 사용되는 전형적인 처리 체인입니다."서브렛과 다른 점은 사용자에게 직접 응답을 생성할 수 없다는 것입니다.전체 프로세스는 Filter가 사용자 요청을 미리 처리한 다음 Servlet에 요청을 전달하여 응답을 생성하고 마지막으로 Filter가 서버 응답을 나중에 처리하는 것입니다.
Filter는 다음과 같은 몇 가지 용도가 있다.
4
  • HttpServletRequest가 Servlet에 도착하기 전에 고객의 HttpServletRequest를 차단합니다

  • 4
  • 필요에 따라 HttpServletRequest를 검사하고 HttpServletRequest 헤더와 데이터를 수정할 수 있습니다

  • 4
  • HttpServletResponse가 클라이언트에 도착하기 전에 HttpServletResponse를 차단합니다

  • 4
  • 필요에 따라 HttpServletResponse를 검사하고 HttpServletResponse 헤더와 데이터를 수정할 수 있습니다

  • Filter에는 다음과 같은 몇 가지 종류가 있습니다.
    4
  • 사용자가 권한을 부여한 Filter: Filter는 사용자의 요청을 검사하고 요청에 따라 사용자의 불법 요청을 필터합니다

  • 4
  • 로그 Filter: 특정 사용자 요청을 자세히 기록합니다

  • 4
  • 디코딩을 담당하는 Filter: 비표준 인코딩에 대한 요청 디코딩을 포함합니다

  • 4
  • XML 내용을 바꿀 수 있는 XSLT Filter 등

  • 4
  • Filter는 여러 개의 요청 또는 응답을 차단할 수 있습니다.하나의 요청이나 응답도 여러 요청에 의해 차단될 수 있습니다

  • Filter를 생성하려면 다음 두 단계를 수행합니다.
    4
  • Filter 처리 클래스를 만듭니다
  • web.xml 파일에 Filter를 구성합니다

  •                   
             
    다음은 모든 사용자의 요청을 차단하고 요청한 정보를 로그에 기록하는 간단한 기록 로그를 소개합니다.
    LogFilter 필터 클래스
    package com.ljq.servlet;

    import java.io.IOException;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;

    public class LogFilter implements Filter {
    // FilterConfig Filter
    private FilterConfig config;

    //
    public void init(FilterConfig config) {
    this.config = config;
    }

    //
    public void destroy() {
    this.config = null;
    }

    //
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)
    throws IOException, ServletException {
    // --------- ---------
    // ServletContext ,
    ServletContext context = this.config.getServletContext();
    long before = System.currentTimeMillis();
    System.out.println(
    " ...");
    // HttpServletRequest
    HttpServletRequest hrequest = (HttpServletRequest) request;
    //
    context.log("Filter : " + hrequest.getServletPath());
    // Filter ,
    chain.doFilter(request, response);

    // --------- ---------
    long after = System.currentTimeMillis();
    //
    context.log(" ");
    //
    context.log(" " + hrequest.getRequestURI() + " : "
    + (after - before));
    }

    }

            
    web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
    ="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.ljq.servlet.LogFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

    위 프로그램은doFilter () 방법을 실현했습니다. 이 방법을 실현하면 사용자의 요청을 미리 처리할 수도 있고, 서버 응답을 후처리할 수도 있습니다. 이들의 경계선은chain을 호출했는지 여부입니다.doFilter (), 이 방법을 실행하기 전에 사용자 요청을 미리 처리합니다.이 방법을 실행하면 서버 응답을 후처리합니다.
    위의 요청Filter에서 요청한 URL만 로그에 기록하고 모든 요청에 chain을 실행합니다.doFilter (request,reponse) 방법은 Filter가 요청을 필터한 후에도 요청을 목적 주소로 보냅니다.사용 권한을 확인하려면 Filter에서 사용자가 요청한 HttpSession에 따라 사용 권한이 충분한지 여부를 판단할 수 있습니다.권한이 부족하면, 직접 호출해서 방향을 바꾸면 됩니다. chain을 호출할 필요가 없습니다.doFilter 방법.
              
              
    다음은 인스턴스입니다.
    package com.ljq.servlet;

    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.HttpSession;

    public class AuthorityFilter implements Filter {
    private FilterConfig config;

    //
    public void init(FilterConfig config) {
    this.config = config;
    }

    //
    public void destroy() {
    this.config = null;
    }

    //
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)
    throws IOException, ServletException {
    // Filter
    String encoding = config.getInitParameter("encoding");
    String login
    = config.getInitParameter("login");

    // request
    request.setCharacterEncoding(encoding);
    HttpServletRequest req
    = (HttpServletRequest) request;
    HttpSession session
    = req.getSession();
    //
    String requestPath = req.getServletPath();


    // session user null,
    //
    if (session.getAttribute("user") == null
    && !requestPath.endsWith(login)) {
    // forward
    request.setAttribute("tip", " ");
    request.getRequestDispatcher(login).forward(request, response);
    }
    //
    else {
    chain.doFilter(request, response);
    }
    }
    }

          
    위의 FilterdoFilter 방법에서 2줄 사체 코드는 Filter의 설정 파라미터를 가져오는 데 사용되고 프로그램의 굵은 글자 코드는 이 Filter의 핵심이다. ①번호 코드는 설정 파라미터에 따라 Request 인코딩에 사용되는 문자 집합을 설정한다. 다음 굵은 글자 코드는session 범위 내에user 속성이 있는지 판단한다. 이 속성이 없으면 로그인이 없다고 여긴다. 만약에 로그인이 없다면그리고 요청 주소도 로그인 페이지가 아니어서 시스템은 로그인 페이지로 바로 이동한다.
    웹에서.xml 파일에서 이 Filter를 설정하고 init-param 요소를 사용하여 이 Filter 설정 파라미터를 설정합니다. init-param은 다음과 같은 두 개의 하위 요소를 받아들일 수 있습니다.
    param-name: 매개변수 이름을 지정합니다.
    param-value: 매개 변수 값을 지정합니다.
    Filter 구성 세그먼트는 다음과 같습니다.
    web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
    ="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- Filter -->
    <filter>
    <filter-name>authority</filter-name>
    <filter-class>com.ljq.servlet.AuthorityFilter</filter-class>
    <!-- 3 init-param 3 -->
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
    <param-name>login</param-name>
    <param-value>/login.jsp</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>authority</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>


    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

    위 설정 세션의 굵은 글자 코드는 Filter에 두 개의 설정 파라미터를 지정하고,login을/login으로 지정합니다.jsp, 이것은 이 응용 프로그램에 로그인하지 않으면 일반 사용자는/login에만 접근할 수 있음을 나타냅니다.jsp.사용자가 이 응용 프로그램에 로그인한 후에만 다른 페이지에 자유롭게 접근할 수 있습니다.

    좋은 웹페이지 즐겨찾기