목차
ServletContextAttributeListener 리스너
이 기사는 백엔드 전체 노트 세트의 세 번째 부분에 속합니다.
| 청취자
청취자의 기본 개요
-
소개하다
-
수신기는 총 8개의 인터페이스가 있는 서블릿 사양의 인터페이스 그룹입니다. servlet-api.jar 패키지는 Tomcat에 있습니다.
-
리스너 인터페이스는 개발자가 직접 구현해야 하며 Http 서버에서 제공하는 jar 패키지에는 해당 구현 클래스가 없습니다.
-
리스너의 주요 기능 은 [범위 객체 수명 주기 변경 순간] 및 [범위 객체 공유 데이터 변경 순간]을 모니터링하는 것입니다.
-
나중에 우리는 두 가지 가장 중요한 리스너인 ServletContextListener, ServletContextAttributeListener를 배울 것입니다.
-
-
검토: 범위 개체
-
Servlet 명세에서는 서버의 메모리에서 일정한 조건 하에서 두 Servlet 사이에 데이터 공유 방식을 제공할 수 있는 객체를 [범위 객체]라고 한다.
-
서블릿 사양의 범위 개체: 쿠키는 범위 개체가 아니라 브라우저 캐시로 존재합니다 .
-
ServletContext 전역 범위 개체, HttpSession 세션 범위 개체, HttpServletRequest 요청 범위 개체의 세 가지 범위 개체가 있습니다.
-
ServletContextListener 리스너
소개
-
역할: 이 인터페이스를 통해 ServletContext 전역 범위 개체가 초기화되고 소멸되는 순간을 법적으로 모니터링합니다.
-
ServletContextListener 인터페이스 구현 클래스 개발 세 단계
-
ServletContextListener 인터페이스 구현
-
public class ListenerClass implements ServletContextListener
-
.
-
리스너 수신 이벤트 처리 메서드 재작성: contextInitialized, contextDestroyed
-
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 인터페이스 구현 클래스 개발 세 단계
-
ServletContextListener 인터페이스 구현
-
public class ListenerClass implements ServletContextAttributeListener
-
이벤트 처리 메서드(attributeAdded, attributeRemoved, attributeReplaced)를 수신하도록 수신기를 다시 작성합니다.
-
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 서버를 가로채고 현재 요청에 대해 향상된 작업을 수행합니다.
-
필터 구현 단계
-
필터 인터페이스 구현 클래스 개발 단계: 세 단계
-
Filter 인터페이스를 구현할 Java 클래스를 생성합니다(참고: 많은 Filter가 있으며 구현하려는 것은 Sevlet의 Filter입니다.)
-
필터 인터페이스에서 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 없이 액세스 가능)