>  기사  >  Java  >  JavaWeb의 필터에 대한 자세한 소개

JavaWeb의 필터에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-16 10:14:141439검색

이 글은 주로 JavaWeb의 필터필터에 대한 자세한 설명을 소개하고, JavaWeb의 필터 사용법을 예제와 함께 분석한 내용으로 실용성이 뛰어나 도움이 필요한 친구들이 참고할 수 있습니다.

원래는 JSP를 요약하기 위해 이 글을 기획했습니다. JSP에는 컨텐츠가 많고, 체중 감량을 위해 밤에 달리고 싶기 때문에 오늘은 Filter와 그 사용 예를 소개하겠습니다. 이런 식으로 아직 운동할 시간이 좀 있어요. 집에 더 가까운 필터는 말 그대로 차단 및 필터링 기능을 가지고 있으며 JavaWeb의 차단 마법사라고 볼 수 있습니다.

1. Origin

클라이언트가 요청을 시작하므로 서버가 모든 요청에 ​​응답할 수 없습니다. 차단 처리는 작업량을 줄일 수 있을 뿐만 아니라. 마찬가지로 데이터의 보안을 보호할 수도 있습니다. 마찬가지로 서버가 클라이언트에 응답할 때 일반 이미지에 워터마크를 추가하는 등 필터링이 필요한 경우도 있습니다. 이러한 문제를 해결하기 위해 필터가 등장했습니다. 때로는 요청과 응답이 한 수준에서만 필터링되는 것이 아니라 여러 수준에서 필터링될 수도 있으므로 필터 체인(FilterChain) 개념을 제안합니다. >2 ,

을 사용하여 기능을 숙지한 후 사용하세요. 필터는 요청이 Servlet에 도달하기 전과 응답이 브라우저에 도달하기 전에 필터링 체인을 통과합니다.

asp.net

의 http모듈과 다소 유사합니다. Filter를 사용하면 주로 javax.servlet.filter인터페이스를 구현합니다. API를 보면 3가지 메소드가 있음을 알 수 있습니다. 1.public void init(FilterConfig filterConfig)가 서블릿을 발생시킵니다예외

서블릿에 포함될 필터를 나타내기 위해 웹 컨테이너에서 호출됩니다. 서비스. 서블릿 컨테이너는 필터를 인스턴스화한 후 init 메소드를 한 번만 호출합니다. 필터에 필터링 작업을 요청하기 전에 init 메소드가 성공적으로 완료되어야 합니다. init 메소드가 ServletException을 발생시키거나 웹 컨테이너에서 정의한 기간 내에 반환하지 않는 경우 웹 컨테이너는 필터를 서비스에 넣을 수 없습니다. 이는 서블릿의 라이프사이클과 다소 유사합니다. 한 번만 초기화되고 destroy()도 한 번 실행됩니다.

2. public void doFilter(ServletRequest 요청, ServletResponse 응답, FilterChain 체인)는 java.io.IOException, ServletException

마지막 쌍으로 인해 매번 발생합니다. 체인의 리소스에 대한 클라이언트 요청이 체인을 통해 요청/응답 쌍을 전달하면 컨테이너는 필터의 doFilter 메소드를 호출합니다. 이 메소드에 전달된 FilterChain을 통해 필터는 요청과 응답을 체인의 다음 엔터티에 전달할 수 있습니다. 이 방법의 일반적인 구현은 다음 패턴을 따릅니다.

1. 요청을 확인합니다

2. 선택적으로 사용자 지정 구현을 사용하여 요청을 전달합니다

입력 필터링을 위해 필터 콘텐츠 또는 헤더로 래핑된
객체

3. 선택적으로 사용자 정의 구현을 사용하여 응답 객체를 출력 필터링을 위해 필터 콘텐츠로 래핑하거나

헤더에 래핑합니다. 4. a) FilterChain 객체(chain.doFilter())를 사용하여 체인의 다음 엔터티


를 호출할 수 있습니다. b) 또한 요청 처리를 차단하지 않는 것도 가능합니다. 요청/응답 쌍을 필터 체인의 다음 엔터티로 전달


5. 필터 체인의 다음 엔터티를 호출한 후 직접 응답에 헤더를 설정합니다.


3. public void destroy()

서비스에서 제거할 필터를 나타내기 위해 웹 컨테이너에서 호출됩니다. 이 메서드는 필터의 doFilter 메서드에 있는 모든 스레드가 종료되거나 제한 시간이 경과한 후에 한 번만 호출됩니다. 이 메소드를 호출한 후 웹 컨테이너는 이 필터 인스턴스에서 doFilter 메소드를 호출하지 않습니다. 이 방법은 필터가 보유한 모든 리소스(예: 메모리, 파일 핸들 및 스레드)를 정리할 수 있는 기회를 제공하고 모든 영구

상태

가 필터의 현재 상태와 동기화되도록 보장합니다. 메모리. 3. 사례

필터를 사용할 수 있는 곳이 많기 때문에 여기서는 하나씩 예제를 제공하지 않겠습니다. 이전 블로그에 HelloWorld 프로젝트를 기반으로 안티리칭 기능을 구현하여 필터 사용을 체험해 볼 수 있습니다. 1. 준비

HelloWolrd 프로젝트 폴더를 추가하고 그 폴더에 err.png와 test.png 두 장의 사진을 넣어주시면 됩니다

2. 필터 생성

여기에는 새로운 필터 패키지가 없습니다. 이전 블로그의 com.test.cyw 패키지에서 직접 필터 파일을 생성해야 합니다. 필터를 관리하기 위한 것입니다. 이것은 단지 테스트용일 뿐입니다. 생성 후에는 MyFilterFilter를 상속하는 것을 볼 수 있습니다.


 public class MyFilter implements Filter

3. doFilter에 핫링크 방지 구현


package com.test.cyw;

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.annotation.WebFilter;
import javax.servlet.http.*;

/*@WebFilter("/MyFilter")*/
public class MyFilter implements Filter {

  public MyFilter() {
    
  }

  public void destroy() {
    
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse res=(HttpServletResponse)response;
    String referer=req.getHeader("referer");//链接来源地址
    if(referer==null||!referer.contains(req.getServerName()))
    {
      req.getRequestDispatcher("/Images/err.png").forward(req, res);
      return;
    }
    chain.doFilter(req, res);
  }

  public void init(FilterConfig fConfig) throws ServletException {
    
  }
}

4.필터 구성

위의 내용은 Filter 인터페이스를 구현하는 클래스를 생성하는 것입니다. Tomcat에 알리는 방법은 Servlet과 유사하며 Web.xml에서 구성해야 합니다. 서블릿을 구성하는 것과 약간 동일합니다.


  <filter>
   <filter-name>MyFilter</filter-name>
   <filter-class>com.test.cyw.MyFilter</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>MyFilter</filter-name>
   <url-pattern>/Images/*</url-pattern>
 </filter-mapping>

5. Test

test.jsp 파일을 생성하고 jsp에서 img를 표시하면 정상적으로 표시됩니다


 <%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="防盗链" src="Images/test.png" width="400">
</body>
</html>

test.png 주소를 브라우저에 직접 입력하면 err.png

4. 문제 발생

처음에는 주소 오류로 인해 Google Chrome test.jsp에서도 err.png 사진이 표시되었는데, 하지만 페이지를 새로 고쳐도 아무런 변화가 없었습니다. 이로 인해 매우 당황스러웠습니다. 가끔 Tomca를 다시 시작해도 작동하지 않고 여러 번 계속 작동합니다. 실제로 작동하지 않을 때 IE로 시도했지만 디스플레이가 올바르다고는 예상하지 못했습니다.

캐시 로 인해 표시가 잘못되었습니다.

5. 요약

필터의 용도는 다양하며, 프로젝트를 수행할 때 먼저 몇 가지를 구현할 수 있습니다. 워터마크 등과 같이 일반적으로 사용되는 것입니다. 이를 사용할 때 문제를 해결하려면 XML만 구성하면 됩니다. 이는 매우 편리합니다.

위 내용은 JavaWeb의 필터에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.