
当访问服务器资源时,过滤器可以将请求拦截下来,完成一些特殊的功能;
一般用于完成通用的操作,如登录验证、统一编码处理、敏感字符的过滤;
第一步:定义一个类,实现接口Filter;
第二步:复写方法;
第三步:配置拦截路径;
注解配置方式:
1、过滤对所有资源的请求:
@WebFilter("/*")//访问所有资源之前都会执行该过滤器
2、过滤对特定资源的请求:
@WebFilter("/index.jsp")//访问index.jsp资源之前都会执行该过滤器
对请求放行的代码:
filterChain.doFilter(servletRequest, servletResponse);package com.zibo.servlet.fliter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")//访问所有资源之前都会执行该过滤器
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter...");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
}<filter>
<filter-name>myFilter</filter-name>
<!--必须实现javax.servlet.Filter接口-->
<filter-class>com.zibo.servlet.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<!--url-pattern是拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>请求的时候 : 执行放行上面的代码
响应的时候 : 执行放行下面的代码
1、具体资源路径:/index.jsp,只有访问index.jsp时过滤器会执行;(使用较少)
2、目录拦截:/user/*,访问user目录下的资源都会被过滤;
3、后缀名拦截:*.jsp,意思是访问jsp资源的时候执行过滤器;
4、拦截所有资源:/*1、注解配置:
设置dispatcherTypes属性,取值:
①REQUEST:默认值,浏览器直接请求资源;
②FORWORD:转发访问资源;
③INCLUDE:包含访问资源;
④ERROR:错误跳转资源;
⑤ASYNC:异步访问资源;
2、web.xml配置:
设置<dispatcher></dispatcher>标签即可,取值也是上面五种取值;请求时:A --> B --> C
响应时:C --> B --> A
注解配置:按照字符串字符顺序比较,靠前的先执行;
举例:
AFilter与BFilter,AFilter先执行;
AFilter6与AFilter17,AFilter17先执行;
web.xml配置:<filter-mapping>谁定义在上面谁先执行;web三大组件之一;
1、事件;
2、事件源:事件发生的地方;
3、监听器:一个对象;
4、注册监听:将事件、事件源、监听器绑定在一起;
当事件在事件源上发生时指定监听器代码;监听ServletContext对象的创建和销毁;
void contextInitialized(ServletContextEvent sce):
ServletContext创建时调用此方法;
void contextDestroyed(ServletContextEvent sce):
ServletContext销毁前时调用此方法;第一步:定义一个类,实现ServletContextListener接口;
第二步:复写方法;
第三步:配置;
MyServletContextListener:
package com.zibo.servlet.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//一般的用途:加载资源文件
//1、获取ServletContext对象
ServletContext servletContext = sce.getServletContext();
//2、加载资源文件
String config = servletContext.getInitParameter("contextConfigLocation");
//3、获取真实路径
String realPath = servletContext.getRealPath(config);
//4、加载进内存
try {
FileInputStream fis = new FileInputStream(realPath);
//只要这里打印成功,就说明加载到资源文件了
System.out.println(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("ServletContext创建...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁...");
}
}web.xml文件配置(加载资源文件):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml<param-value>
</context-param>applicationContext.xml位置图:

<listener>
<listener-class>这里写接听器实现类的全类名</listener-class>
</listener>//在自定义的ServletContextListener接口实现类加上@WebListener即可
@WebListener
public class MyServletContextListener implements ServletContextListener{
//...
}