Servlet 过滤器
Servlet 过滤器(Filter)与 Servlet 十分相似,但 Filter 具有拦截客户端请求的功能, Filter 可以改变请求中的内容,以便满足实际开发中的需要。对于程序开发人员而言, Filter 实质上就是 Web 服务器上的一个应用组件,用于拦截客户端与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。如图所示:

如果一个 Web 应用中使用一个 Filter 不能解决史记中的业务需要,那么可以部署多个过滤器对业务请求进行多次处理,这样就组成了一个过滤器链。Web 容器在处理过滤器链时,将按照过滤器的先后顺序对请求进行处理,如图所示:

Filter创建过程:
要编写一个过滤器必须实现Filter接口。实现其接口规定的方法。
1、实现jakarta.servlet.Filter接口
2、实现init方法,读取过滤器的初始化参数
3、实现doFilter方法,完成对请求或响应的过滤
4、调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
创建Filter有两种方式:基于web.xml配置文件、基于@WebFilter注解
基于web.xml
<filter><filter-name>MyFilter</filter-name><filter-class>com.iss.filter.MyFilter</filter-class><init-param><param-name>userName</param-name><param-value>admin</param-value></init-param></filter><filter-mapping><filter-name>MyFilter</filter-name><!-- 配置过滤器 url 映射 --><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping>
创建filter
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");System.out.println(filterConfig.getInitParameter("userName"));}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行url,进入此方法");chain.doFilter(request,response);//进入下一个过滤器或url}@Overridepublic void destroy() {System.out.println("关闭服务器时执行");}
}
基于@WebFilter注解
@WebFilter(filterName = "myFilter",urlPatterns = "/*",initParams = {@WebInitParam(name="userName",value = "admin")},dispatcherTypes = DispatcherType.REQUEST)public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");System.out.println(filterConfig.getInitParameter("userName"));}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行url,进入此方法");chain.doFilter(request,response);//进入下一个过滤器或url}@Overridepublic void destroy() {System.out.println("关闭服务器时执行");}
}
Filter应用示例 解决乱码问题fitler
@WebFilter(filterName = "charactorFilter", urlPatterns = "/*", initParams = {@WebInitParam(name = "encoding", value = "UTF-8") })
public class CharactorFilter implements Filter {private String encoding;public void init(FilterConfig fConfig) throws ServletException {encoding = fConfig.getInitParameter("encoding");}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {if (encoding != null) {request.setCharacterEncoding(encoding);response.setContentType("text/html;charset=" + encoding);}chain.doFilter(request, response);}public void destroy() {}
}
Listener介绍
servlet监听器也叫web监听器。是servlet中一种特殊类。能够帮助开发者监听web应用中的特定事件。比如ServletContext,ServletSession,ServletRequest的创建和销毁,变量的创建和销毁等。
监听器常用的用途:
统计在线人数,利用HttpSessionListener
加载初始化信息:利用ServletContextListener
统计网站访问量:利用ServletRequestListener
实现访问监控:利用ServletRequestListener
Listener分类
在 Servlet 规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext、HttpSession和 ServletRequest这三个域对象。
Servlet 规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
- 监听域对象自身的创建和销毁的事件监听器。
- 监听域对象中的属性的增加和删除的事件监听器。
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
listener应用
ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。
ServletContext 域对象创建和销毁时机:
创建:服务器启动针对每一个Web应用创建 ServletContext;
销毁:服务器关闭前先关闭代表每一个 web 应用的 ServletContext;
@WebListener
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("ServletContext has create ...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("ServletContext has destroyed ...");}
}
