[서블릿] 7: 리스너와 필터의 원리와 적용

목차

| 청취자

청취자의 기본 개요

ServletContextListener 리스너

ServletContextAttributeListener 리스너

리스너의 애플리케이션 시나리오

| 필터

필터의 기본 개요

필터 구현 단계

필터 애플리케이션 시나리오


이 기사는 백엔드 전체 노트 세트의 세 번째 부분에 속합니다.

(업데이트 중) [백엔드부터 시작해서 흙속으로 파고들기! 】Java+Servlet+JDBC+SSM+SpringBoot+SpringCloud Basic Introduction_m0_57265007's Blog - CSDN 블로그에 백엔드 시작부터 시작까지의 기사. Java Basic + Advanced, MySQL, JDBC, Servlet, SSM, SpringBoot, SpringCloud, 프로젝트 노트가 포함되어 있습니다. https://blog.csdn.net/m0_57265007/article/details/127962617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22 %3A%22127962617%22%2C%22source%22%3A%22m0_57265007%22%7D 기사, 백엔드 항목에서 토양으로. Java Basic + Advanced, MySQL, JDBC, Servlet, SSM, SpringBoot, SpringCloud, 프로젝트 노트가 포함되어 있습니다. https://blog.csdn.net/m0_57265007/article/details/127962617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22 %3A%22127962617%22%2C%22소스%22%3A%22m0_57265007%22%7D

| 청취자

청취자의 기본 개요

  • 소개하다

    • 수신기는 총 8개의 인터페이스가 있는 서블릿 사양의 인터페이스 그룹입니다. servlet-api.jar 패키지는 Tomcat에 있습니다.

    • 리스너 인터페이스는 개발자가 직접 구현해야 하며 Http 서버에서 제공하는 jar 패키지에는 해당 구현 클래스가 없습니다.

    • 리스너의 주요 기능 은 [범위 객체 수명 주기 변경 순간] 및 [범위 객체 공유 데이터 변경 순간]을 모니터링하는 것입니다.

    • 나중에 우리는 두 가지 가장 중요한 리스너인 ServletContextListener, ServletContextAttributeListener를 배울 것입니다.

  • 검토: 범위 개체

    • Servlet 명세에서는 서버의 메모리에서 일정한 조건 하에서 두 Servlet 사이에 데이터 공유 방식을 제공할 수 있는 객체를 [범위 객체]라고 한다.

    • 서블릿 사양의 범위 개체: 쿠키는 범위 개체가 아니라 브라우저 캐시로 존재합니다 .

    • ServletContext 전역 범위 개체, HttpSession 세션 범위 개체, HttpServletRequest 요청 범위 개체의 세 가지 범위 개체가 있습니다.


ServletContextListener 리스너

소개

  • 역할: 이 인터페이스를 통해 ServletContext 전역 범위 개체가 초기화되고 소멸되는 순간을 법적으로 모니터링합니다.

  • ServletContextListener 인터페이스 구현 클래스 개발 세 단계

    1. ServletContextListener 인터페이스 구현

public class ListenerClass implements ServletContextListener
  1. .

  2. 리스너 수신 이벤트 처리 메서드 재작성: contextInitialized, contextDestroyed

  3. web.xml 파일에서 Http 서버에 수신기 인터페이스 구현 클래스를 등록합니다.

    <!--将监听器接口注册到Tomcat-->
    <listener>
        <listener-class>监听器类</listener-class>
    </listener>

청취 이벤트 처리 방법:

public void contextInitlized();   //全局作用域对象被Http服务器初始化被调用
public void contextDestory();   //在全局作用域对象被Http服务器销毁时候触发调用

public class ListenerClass implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("全局作用域对象 ServletContext 被创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("全局作用域对象 ServletContext 被销毁");
    }
}

public class S1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>S1</servlet-name>
        <servlet-class>S1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S1</servlet-name>
        <url-pattern>/S1</url-pattern>
    </servlet-mapping>

    <!--将监听器接口注册到Tomcat-->
    <listener>
        <listener-class>ListenerClass</listener-class>
    </listener>

</web-app>

 

 

ServletContextAttributeListener 리스너

소개

  • 역할: 이 인터페이스를 통해 ServletContext 전역 범위 개체의 공유 데이터가 변경되는 시간을 법적으로 모니터링합니다.

  • ServletContextAttributeListener 인터페이스 구현 클래스 개발 세 단계

    1. ServletContextListener 인터페이스 구현

public class ListenerClass implements ServletContextAttributeListener

  1. 이벤트 처리 메서드(attributeAdded, attributeRemoved, attributeReplaced)를 수신하도록 수신기를 다시 작성합니다.

  2. web.xml 파일에서 Http 서버에 수신기 인터페이스 구현 클래스를 등록합니다.

청취 이벤트 처리 방법:

public void contextAdd();   //在全局作用域对象添加共享数据
public void contextReplaced();   //在全局作用域对象更新共享数据
public void contextRemove();   //在全局作用域对象删除共享数据

public class ListenerClass2 implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("检测到全局作用域对象数据有【新增】");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("检测到全局作用域对象数据有【删除】");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("检测到全局作用域对象数据有【修改】");
    }
}

 

public class S1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext application = req.getServletContext();
        application.setAttribute("key1",100);  //新增
        application.setAttribute("key1",200);  //更新
        application.removeAttribute("key1");   //删除
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>S1</servlet-name>
        <servlet-class>S1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S1</servlet-name>
        <url-pattern>/S1</url-pattern>
    </servlet-mapping>

    <!--将ListenerClass2监听器实现类注册到Tomcat-->
    <listener>
        <listener-class>ListenerClass2</listener-class>
    </listener>

</web-app>

 

 

리스너의 애플리케이션 시나리오

  • ServletContextListener 리스너를 사용하면 contextInitlized( ) 메서드에서 전역 초기화가 필요한 코드를 작성할 수 있고 contextDestroy( ) 메서드에서 메모리 해제가 필요한 코드를 작성할 수 있습니다.

  • ServletContextAttributeListener 리스너를 사용하여 데이터 변경 사항을 모니터링하고 해당 동작을 작성할 수 있습니다.


| 필터

필터의 기본 개요

  • 소개하다

    • 필터 인터페이스는 Servlet 사양 아래의 인터페이스에서 가져오고 Tomcat의 servlet-api.jar 패키지에 있습니다.

    • Filter 인터페이스의 구현 클래스는 개발자가 작성하며 Http 서버는 이를 제공할 책임이 없습니다.

    • Filter의 역할 : Http 서버가 리소스 파일을 호출하기 전에 Http 서버를 가로채는 역할

  • 구체적인 작용

    • Http 서버를 가로채서 Http 서버가 현재 요청의 적법성을 감지하도록 돕고 적법한 경우 해제합니다.

    • HTTP 서버를 가로채고 현재 요청에 대해 향상된 작업을 수행합니다.


필터 구현 단계

  • 필터 인터페이스 구현 클래스 개발 단계: 세 단계

    1. Filter 인터페이스를 구현할 Java 클래스를 생성합니다(참고: 많은 Filter가 있으며 구현하려는 것은 Sevlet의 Filter입니다.)

    2. 필터 인터페이스에서 doFilter 메소드 재정의

public class FilterClass implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        
    }
}

 3. web.xml은 필터 인터페이스 구현 클래스를 Http 서버에 등록합니다.

<filter-mapping>
    <filter-name>oneFilter</filter-name>
    <url-pattern>拦截地址</url-pattern>
</filter-mapping>

(차단 주소는 Tomcat에게 어떤 리소스 파일을 호출하기 전에 필터링 및 차단을 위해 OneFilter를 호출해야 함을 알려줍니다.) 차단 주소를 작성하는 방법에는 여러 가지가 있으며 그 중 일부는 아래에 나열되어 있습니다.

<!--要求Tomcat在调用【某一个具体文件】之前,来调用OneFilter拦截-->
<url-pattern>/img/mm.jpg</url-pattern>

<!--要求Tomcat在调用【某一个文件夹下所有的资源文件】之前,来调用OneFilter拦截-->
<url-pattern>/img/*</url-pattern>

<!--要求Tomcat在调用【任意文件夹下某种类型文件】之前,来调用OneFilter拦截-->
<url-pattern>*.jpg</url-pattern>

<!--要求Tomcat在调用【网站中任意文件】时,来调用OneFilter拦截-->
<url-pattern>/*</url-pattern>

필터 애플리케이션 시나리오

  • Tomcat이 [특정 파일]을 호출하기 전에 OneFilter 차단을 호출하도록 요구: 사용자 정보를 얻고, 조건을 판단하고, 조건이 충족되지 않으면 대상 파일에 대한 사용자 액세스를 거부합니다.

 

Tomcat이 [웹사이트의 모든 파일]을 호출할 때 OneFilter 인터셉션을 호출하도록 요구: 인터셉트된 요청 객체에 알리고 인코딩에 UTF-8 문자 세트 사용(코드 커플링 감소)

 

[웹사이트의 모든 파일]을 호출할 때 Tomcat이 OneFilter 가로채기를 호출하도록 요구: 악의적인 로그인 방지(HttpSession 없이는 로그인 불가, 등록만 가능)

 

공개 페이지와 관련된 페이지가 무조건 해제되도록 허용(즉, 로그인 또는 HttpSession 없이 액세스 가능)

 

 

추천

출처blog.csdn.net/m0_57265007/article/details/128006107