Java의 Filter 필터에 대한 간단한 설명
필터라고도 하는데 이것은 Servlet 기술 중 가장 실용적인 기술이다. 웹 개발자는 Filter 기술을 통해 웹 서버가 관리하는 모든 웹 자원을 차단한다. 예를 들어 Jsp, Servlet, 정적 이미지 파일이나 정적 html 파일 등을 차단하여 특수한 기능을 실현한다.예를 들어 URL 수준의 권한 접근 제어, 민감한 어휘 필터링, 응답 정보 압축 등 고급 기능을 실현한다.
이것은 주로 사용자 요청을 미리 처리하거나 HttpServletResponse를 사후 처리하는 데 사용됩니다.Filter의 전체 프로세스를 사용합니다: Filter는 사용자 요청을 미리 처리한 다음 Servlet에 요청을 처리하고 응답을 생성합니다. 마지막으로 Filter는 서버 응답을 처리합니다.
Filter 기능
HttpServletRequest가 Servlet에 도착하기 전에 고객의 HttpServletRequest를 차단합니다.필요에 따라 HttpServletRequest를 검사하거나 HttpServletRequest 헤더와 데이터를 수정할 수 있습니다.
HttpServletResponse가 클라이언트에 도착하기 전에 HttpServletResponse를 차단합니다.필요에 따라 HttpServletResponse를 검사하거나 HttpServletResponse 헤더와 데이터를 수정할 수 있습니다.
Filter 를 통한 차단 방법
Filter 인터페이스에 doFilter 방법이 있습니다. 개발자가 Filter를 작성하고 어느 웹 자원을 차단하는지 설정한 후에 웹 서버는 웹 자원의 서비스 방법을 호출하기 전에 Filter의 doFilter 방법을 호출합니다. 따라서 이 방법에서 코드를 작성하면 다음과 같은 목적을 달성할 수 있습니다.
목표 자원을 호출하기 전에 코드를 실행하십시오.
대상 자원을 호출할지 여부입니다. 즉, 사용자가 웹 자원에 접근하도록 할지 여부입니다.
웹 서버는 DoFilter 방법을 호출할 때 FilterChain 대상을 전달합니다. FilterChain 대상은 filter 인터페이스에서 가장 중요한 대상입니다. 또한 DoFilter 방법을 제공합니다. 개발자는 수요에 따라 이 방법을 호출할지 여부를 결정할 수 있습니다. 이 방법을 호출하면 웹 서버는 웹 자원의 서비스 방법을 호출합니다. 즉, 웹 자원이 방문되지 않으면 웹 자원이 방문하지 않습니다.
Filter 개발 2단계
자바 클래스를 작성하여 Filter 인터페이스를 실현하고doFilter 방법을 실현합니다.
웹에서xml 파일에 작성된 필터 클래스를 등록하고 차단할 수 있는 자원을 설정합니다.
web.xml 설정 노드 소개:
하나의 웹 응용 프로그램에서 여러 개의 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>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
FilterServlet 작성
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;
/**
* ,
*/
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 페이지와 자바 코드에서 서로 다른 문자 집합을 사용하여 인코딩을 할 때 폼에서 제출한 데이터가 나오거나 중국어 이름 파일을 업로드/다운로드하는 데 오류가 발생하면 이 필터를 사용할 수 있습니다.
<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>
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.