javaweb 개발 Filter
서브렛2.3규범에서 필터를 정의했는데 servlet 용기에서 servlet을 호출하는 과정을 차단하여 servlet이 응답 처리를 하는 전후에 특수한 기능을 실현한다.
필터가 책임 체인의 모델을 실현했다.여러 개의 필터가 하나의 필터 체인을 형성하고 필터 체인에서 서로 다른 필터의 선후 순서는 파일 웹을 배치합니다.xml에서 필터가
클라이언트 요청을 가장 먼저 캡처한 필터는 서브렛/JSP의 응답 정보를 마지막으로 캡처합니다.
서브렛 필터가 필터링할 수 있는 웹 구성 요소는 서브렛, JSP, HTML 등의 파일입니다.
서브렛 필터는 클라이언트와 서브렛 사이, 서브렛과 서브렛 또는 JSP 페이지 사이, 포함된 각 JSP 페이지 사이에 적용할 수 있습니다.
둘째, 서브렛에서 필터를 사용할 때 필터는 클라이언트의 요청을 처리할 수 있습니다.처리가 완료되면 다음 필터 처리에 맡기고 고객의 요청은 대상이 전송될 때까지 필터 체인에서 하나씩 처리됩니다.대상 처리가 끝나면 클라이언트로 돌아갈 때까지 마지막 필터를 따라 하나씩 처리됩니다.
3. Filter 관련 인터페이스
1. Filter 커넥터
모든 서브렛 필터는 javax를 구현해야 합니다.servlet.Filter 인터페이스 및 이 인터페이스에서 다음 세 가지 방법을 사용할 수 있습니다.
init(FilterConfig filterConfig)
서브렛 필터를 초기화하는 방법으로, 서브렛 컨테이너가 서브렛 필터 인스턴스를 만든 후 이 방법을 호출합니다.이 방법은 웹을 읽을 것입니다.xml 파일의 서브렛 필터의 초기화 매개변수입니다.이 방법은tomcat이 시작될 때 실행됩니다.
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
이 메서드는 클라이언트 요청 메서드가 필터 설정과 일치하는 URL을 설정할 때 서브렛 컨테이너에서 필터의 doFilter 메서드를 먼저 호출하는 실제 필터링 작업을 수행합니다.FilterChain 사용자는 다음 필터에 액세스합니다.
여기의 서브렛 Request와 서브렛 Response는 일반적으로 구체적인 서브렛으로 변환해야 한다. 예를 들어 Http서브렛 Request와 Http서브렛 Response이다.일부 필터는 자원을 소모하기 때문에 중복 필터를 방지해야 하기 때문에doFilter () 방법에서 판단할 수 있습니다.
destroy()
서브렛 컨테이너는 필터 인스턴스를 제거하기 전에 이 메서드를 호출하여 서브렛 필터에 사용된 리소스를 배치합니다.
2. FilterConfig 커넥터
Filter의 init 메서드에서는 FilterConfig 객체를 사용하여 Filter에서 구성된 초기화 매개변수를 가져오는 등의 작업을 수행할 수 있습니다.
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>cn.heimar.LoginFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
</filter>
init 방법에서 획득:@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Filter
String username = filterConfig.getInitParameter("username");
}
3. Filter에서 애플리케이션 액세스
ServletContext context = filterConfig.getServletContext();
또는 DoFilter 메서드에서 변환된 Request에 따라 다음을 가져옵니다.HttpServletRequest req = (HttpServletRequest)request;
ServletContext context = req.getSession().getServletContext();
4. 필터 정의
public class MyFilter implements Filter {
public void init(FilterConfig fc) {
//
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
//
// 。
chain.doFilter(request, response);
//
}
public void destroy( ) {
//
}
}
5. 필터가 웹에 비친다.Filter를 선언하는 데 다음 코드가 xml 파일에 추가됩니다.
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>
cn.edu.uibe.webdev.MyFilter
</filter-class>
<init-param>
<param-name>developer</param-name>
<param-value>TongQiang</param-value>
</init-param>
</filter>
<!-- Servlet -->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>MyServlet</servlet-name>
</filter-mapping>
<!-- URL Pattern -->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/book/*</url-pattern>
</filter-mapping>
/* 모든 자원 및 존재하지 않는 자원 차단
*. jsp가 모든 jsp 파일을 차단하는 경우 기본적으로 forward 방식은 필터되지 않습니다.일반적으로 필터가 필요합니다. 필터-mapping에
6. 흔한 응용은 고객이 제출한 데이터를 재인코딩할 수 있다.
브라우저가 페이지를 캐시하지 않도록 합니다.
불협화음을 필터링합니다.
사용자가 로그인했는지 확인할 수 있습니다.
클라이언트에서 제출한 데이터를 다시 인코딩하는 예:
EncodingFilter.java
package cn.heimar.filter.encoding;
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;
public class EncodingFilter implements Filter {
/**
*
*/
private String encoding;
/**
*
*/
private boolean forceEncoding = false;
@Override
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("ENCODING");
String force = config.getInitParameter("FORCE_ENCODING");
if (force != null)
forceEncoding = Boolean.valueOf(force);
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
if ((request.getCharacterEncoding() == null || forceEncoding)
&& encoding != null){
request.setCharacterEncoding(encoding);
}
response.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}
@Override
public void destroy() {
}
}
web.xml <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.heimar.filter.encoding.EncodingFilter</filter-class>
<!-- -->
<init-param>
<param-name>ENCODING</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- -->
<init-param>
<param-name>FORCE_ENCODING</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.heimar.filter.encoding.LoginServlet</servlet-class>
</servlet>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.