필터 소개
필터를 필터라고도합니다. 서블릿 기술에서 가장 실용적인 기술입니다. 웹 개발자는 필터 기술을 통해 웹 서버에서 관리하는 모든 웹 리소스 (예 : JSP, Servlet, Static Image Files 또는 Static HTML 파일과 같은 모든 웹 리소스를 가로 채어 일부 특수 기능을 달성합니다. 예를 들어, URL 레벨 권한 액세스 제어, 민감한 어휘 필터링 및 응답 정보를 압축하는 것과 같은 일부 고급 기능을 구현하십시오.
주로 사용자 요청을 전처리하는 데 사용되며 httpservletresponse 후 프로세스도 사용할 수도 있습니다. 필터를 사용하는 완전한 프로세스 : 필터 프리 프로세스 사용자 요청을 한 다음 요청을 서비스를 위해 서비스를 처리하고 응답을 생성 한 후 마지막으로 서버 응답을 필터링합니다.
필터 기능
1. HttpservletRequest가 서블릿에 도착하기 전에 클라이언트의 httpservletrequest를 가로 채립니다. 필요에 따라 httpservletrequest를 확인하면 httpservletrequest 헤더 및 데이터도 수정할 수도 있습니다.
2. httpservletresponse가 클라이언트에 도달하기 전에 인터셉트합니다. 필요에 따라 httpservletresponse를 확인하면 httpservletresponse 헤더 및 데이터도 수정할 수도 있습니다.
감기 기능을 구현하기 위해 필터를 사용하는 방법
필터 인터페이스에는 도필터 방법이 있습니다. 개발자가 필터를 작성하고 인터셉트 할 웹 리소스를 구성하면 웹 서버는 웹 리소스의 서비스 메소드를 호출하기 전에 매번 필터의 도필터 메소드를 호출합니다. 따라서이 방법에서 코드를 작성하면 다음과 같은 목적을 달성 할 수 있습니다.
1. 대상 리소스를 호출하기 전에 코드를 실행하십시오.
2. 대상 리소스를 호출할지 여부 (즉, 사용자가 웹 리소스에 액세스 할 수 있는지).
웹 서버가 도필터 메소드를 호출하면 필터 체인 객체를 전달합니다. FilterChain 객체는 필터 인터페이스에서 가장 중요한 객체입니다. 또한 도필터 방법을 제공합니다. 개발자는 필요에 따라이 방법을 호출할지 여부를 결정할 수 있습니다. 이 메소드가 호출되면 웹 서버는 웹 리소스의 서비스 메소드를 호출합니다. 즉, 웹 리소스에 액세스 할 수 있습니다. 그렇지 않으면 웹 리소스에 액세스되지 않습니다.
필터 개발 두 단계
필터 인터페이스를 구현하고 도필터 방법을 구현하기 위해 Java 클래스를 작성하십시오.
Web.xml 파일의 사용 및 요소는 서면 필터 클래스를 등록하고 인터셉트 할 수있는 리소스를 설정합니다.
web.xml 구성 노드 소개 :
<필터 매핑> 요소는 필터가 가로 채기에 담당하는 자원을 설정하는 데 사용됩니다. 필터 인터셉트는 리소스를 두 가지 방식으로 지정할 수 있습니다. 서블릿 이름과 리소스 액세스 요청 경로.
<servlet-name> 필터에 의해 가로 채워진 서블릿의 이름을 지정합니다.
<spatcher> 필터에 의해 가로 채는 자원이 서블릿 컨테이너에 의해 호출되는 방식을 지정합니다. 요청 중 하나, 포함, 포워드 및 오류 및 기본 요청 중 하나 일 수 있습니다. 사용자는 여러 <디스패처> 하위 요소를 설정하여 다양한 호출 리소스를 가로 채기 위해 필터를 지정할 수 있습니다.
자식 요소가 설정할 수있는 가치와 의미는 다음과 같습니다.
필터 체인
웹 애플리케이션에서는 여러 필터를 개발하고 작성하여 하나의 필터 체인으로 결합됩니다.
웹 서버는 Web.xml 파일에 필터가 등록 된 순서에 따라 먼저 호출 할 필터를 결정합니다. 첫 번째 필터의 도필터 메소드가 호출되면 웹 서버는 필터 체인을 나타내는 필터 체인 객체를 만들어 메소드로 전달합니다. 도필터 방법에서 개발자가 FilterChain 객체의 도필터 메소드를 호출하면 웹 서버는 필터 체인 객체에 필터가 여전히 있는지 확인합니다. 있으면 두 번째 필터가 호출되고 아니오가 있으면 대상 리소스가 호출됩니다.
필터의 수명주기
public void init (FilterConfig FilterConfig)는 servletexception; // 초기화를 던집니다
우리가 쓴 서블릿 프로그램과 마찬가지로 필터의 생성 및 파괴는 웹 서버의 책임입니다. 웹 애플리케이션이 시작되면 웹 서버는 필터의 인스턴스 객체를 생성하고 init 메소드를 호출하여 web.xml 구성을 읽으려면 객체 초기화 기능을 완료하여 후속 사용자 요청에 대한 차단을 준비합니다 (필터 객체는 한 번만 생성되며 INT 메소드는 한 번만 실행됩니다). 개발자는 INT 메소드의 매개 변수를 통해 현재 필터 구성 정보를 나타내는 FilterConfig 객체를 얻을 수 있습니다.
Public Void Dofilter (Servletrequest 요청, ServletResponse 응답, Filterchain 체인) IoException, ServleTeXception; // Intercept Request
이 방법은 실제 필터링 작업을 완료합니다. 클라이언트가 필터와 관련된 URL에 대한 액세스를 요청하면 서블릿 필터가 먼저 도필터 메소드를 실행합니다. Filterchain 매개 변수는 후속 필터에 액세스하는 데 사용됩니다.
공개 무효 파괴 (); // 파괴
필터 객체는 생성 후 메모리에 존재하며 웹 응용 프로그램이 제거되거나 서버가 중지되면 파괴됩니다. 웹 컨테이너가 필터 객체를 제거하기 전에 호출됩니다. 이 방법은 필터 수명주기 동안 한 번만 실행됩니다. 이 방법에서는 필터에서 사용하는 리소스를 해제 할 수 있습니다.
FilterConfig 인터페이스
필터를 구성 할 때 사용자는 필터의 일부 초기화 매개 변수를 구성 할 수 있습니다. 웹 컨테이너가 필터 객체를 인스턴스화하고 init 메소드를 호출하면 필터 초기화 매개 변수를 캡슐화하는 필터 콘피드 객체를 전달합니다. 따라서 개발자가 필터를 작성하면 FilterConfig 객체 방법을 통해 다음 내용을 얻을 수 있습니다.
문자열 getFiltername (); // 필터 이름을 가져옵니다. 문자열 getInitParameter (문자열 이름); // 배포 설명에 지정된 이름으로 초기화 매개 변수의 값을 반환합니다. 존재가 없으면 Null을 반환하십시오. 열거 GetInitParameterNames (); // 필터의 모든 초기화 매개 변수의 열거 세트를 반환합니다. Public ServletContext getServletContext (); // 서틀 컨텍스트 객체에 대한 참조를 반환합니다.
필터 사용 사례
필터를 사용하여 사용자 로그인 보안 제어를 확인하십시오
나는 얼마 전에 프로젝트를 유지하는 데 참여했습니다. 사용자가 시스템을 종료 한 후, 그는 주소 바로 갔다가 기록에 접근했습니다. URL에 따르면 그는 여전히 시스템 응답 페이지를 입력 할 수 있습니다. 요청이 필터링되지 않은지 확인하고 사용자 로그인이 로그인되었는지 확인했습니다. 문제를 해결하기 위해 필터를 추가하십시오!
먼저 web.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/jsp; login> <init-param> <param-name> Includestrings </param-name> <!-지정된 필터 매개 변수 접미사 만 필터-> <param- value> .do; .jsp </param-value> </init-param> <init-param> <param-name> redippath </param-name> <!-로그인에 대한 점프를 통하지 않음- <param-value>/index.jsp </param-value> </init-param> <init-param> <init-param> <param-name> disabletestfilter </param-name> <!-y : invalid filter-> <param-value> n </param-value> <!-http://www.manongjc.com/article/1613.3.3.3.1613.3. </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; javax.servletrpronge; javax.servlet.http.http.httpervletrequest; import javax.servlet.http.htttp.httpertresponse; import javax.servlet.http.htttp.htttp.htttp.htttp.htttp.htttp.httervletresponsewrapper;/*** 로그인한지 여부를 결정하고 시스템을 기록하지 않으면 시스템을 Exit*. http://www.manongjc.com/article/1613.html */public class sessionfilter는 필터 {public filterconfig config; public void destrove () {this.config = null; } public static boolean iscontains (문자열 컨테이너, 문자열 [] regx) {boolean result = false; for (int i = 0; i <regx.length; i ++) {if (container.indexof (regx [i])! = -1) {return true; }} 반환 결과; } public void dofilter (servletrequest 요청, ServletRepsonge 응답, 필터 체인 체인) IoException, servleTexception {httpservletRequest hrequest = (httpservletRequest) 요청; httpservletresponsewrapper rapper = new httpservletResponseWrapper ((httpservletResponse) 응답); 문자열 logonstrings = config.getInitParameter ( "logonstrings"); // 로그인 페이지 로그인 페이지 문자열 includestrings = config.getInitParameter ( "IncludEstrings"); // 필터 리소스 접미사 매개 변수 문자열 REDIRECTPATH = hrequest.getContextPath () + config.getInitParameter ( "redirectPath"); // getInitParameter ( "disableTestFilter"); // (disableTestFilter.toupperCase (). equals ( "y")) {// invalid chain.dofilter (요청, 응답); 반품; } string [] logonlist = logonstrings.split ( ";"); 문자열 [] includelist = includestrings.split ( ";"); if (! this.iscontains (hrequest.getRequesturi (), IncludElist)) {// 지정된 필터 매개 변수 접미사 접미사 체인을 필터링합니다 (요청, 응답); 반품; } if (this.iscontains (hrequest.getRequesturi (), logonlist)) {// 로그인 페이지 체인을 필터링하지 마십시오. 반품; } string user = (string) hrequest.getSession (). getAttribute ( "useronly"); // 사용자가 로그인되어 있는지 (user == null) {wrapper.sendRedirect (readirectPath); 반품; } else {chain.dofilter (요청, 응답); 반품; }} public void init (FilterConfig FilterConfig) servletexception {config = FilterConfig; }}이러한 방식으로 사용자에 대한 모든 요청을 완료 할 수 있으며이 필터를 통해 사용자 로그인을 확인해야합니다.
중국어가 달린 필터를 방지하십시오
프로젝트가 스프링 프레임 워크를 사용하는 경우 현재 JSP 페이지 및 인코딩을위한 Java 코드에 다른 문자 세트가 사용되면 양식 제출 된 데이터 또는 중국 이름 파일 업로드/다운로드에 문제가 발생합니다. 그런 다음이 필터를 사용할 수 있습니다.
<filter> <filter-name> 인코딩 </filter-name> <filter-class> org.spramework.web.filter.characterencocterencodingfilter </filter-param> <apar-name> encoding </param-name> <! --- 특정 문자 세트를 지정하는 데 사용됩니다. </init-param> <init-param> <param-name> forceencoding </param-name> <!-true : 요청이 문자 세트를 지정했는지 여부에 관계없이 인코딩이 사용됩니다. False : 요청이 문자 세트를 지정 한 경우 인코딩이 사용되지 않습니다-> <param- value> false </param-value> </init-param> </filter> <filter-mapping> <filter-name> 인코딩 </filter-name> <Url-Pattern>/*</url-pattern> </filter-mapping>
Spring+Hibernate의 OpenSessionInViewFilter는 세션 전환을 제어합니다
Hibernate+Spring과 함께 사용하면 Lazy = True가 설정되면 (지연된로드) 데이터를 읽을 때 최대 절전 모드는 부모 데이터를 읽은 후 세션을 자동으로 닫습니다. 이러한 방식으로, 관련 데이터 및 하위 데이터를 사용하려면 시스템에 LazyInit 오류가 발생합니다. 현재 Spring에서 제공하는 OpenSessionInViewFilter 필터를 사용해야합니다.
OpenSessionInViewFilter는 주로 요청이 모든 페이지를 클라이언트로 보내기 전까지는 세션 상태를 유지하며, 요청이 완료 될 때까지 세션을 닫지 않아 게으른로드로 인한 문제를 해결합니다.
참고 : OpenSessionInViewFilter 구성은 struts2 구성 앞에서 작성해야합니다. 필터를로드 할 때 Tomcat 컨테이너가 순서대로로드되기 때문에 구성 파일이 먼저 Struts2의 필터 구성을 작성한 다음 OpenSessionInViewFilter 필터 구성을 작성하면 데이터를 얻을 때 스프링이 세션을 관리하지 않습니다.
<filter> <!-스프링에 게으른로드-> <filter-name> OpenSessionInViewFilter </filter-name> <filter-class> org.springframework.orm.orm.hibernate3.support.support.opensessioninviewfilter </filter class> <init-param> session-name> sessionfactorybeanname <! 기본적으로 Spring 컨테이너에서 ID가있는 Bean. ID가 SessionFactory가 아닌 경우 다음과 같이 구성해야합니다. 여기서 SessionFactory는 스프링 컨테이너의 콩입니다. -> <param- value> sessionFactory </param-value> </init-param> <init-param> <param-name> Singlessession </param-name> <!-싱글 션은 true로 설정되면, false로 설정되면 true </param-value> </filter-param> </filter param> <filter-name> OpenSessionInViewFilter </filter-name> <Url-pattern>*. do </url-pattern> </필터-매핑>
struts2의 web.xml 구성
프로젝트에서 struts2를 사용하려면 web.xml에서 필터를 구성하여 요청을 가로 채고 처리를위한 struts2의 조치로 이동해야합니다.
참고 : 2.1.3 이전의 struts2 버전에서 필터는 org.apache.struts2.dispatcher.filterdispatcher를 사용합니다. 그렇지 않으면 org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecuteFilter를 사용하십시오. Struts 2.1.3부터 시작하여 ActionContextCleanup 필터는 포기되며 해당 기능은 StrutsprepareandExecuteFilter 필터에 포함됩니다.
세 가지 초기화 매개 변수가 구성됩니다.
<!-struts 2.x 필터-> <filter> <filter-name> struts2 </filter-name> <filter-class.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter class> </filter> <filter-name> struts2 </filter-name> <Url-pattern>*. do </url-pattern> </필터-매핑>
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!