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 {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器");
System.out.println(filterConfig.getInitParameter("userName"));
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行url,进入此方法");
chain.doFilter(request,response);//进入下一个过滤器或url
}
@Override
public void destroy() {
System.out.println("关闭服务器时执行");
}
}
基于@WebFilter注解
@WebFilter(filterName = "myFilter",urlPatterns = "/*",initParams = {@WebInitParam(name="userName",value = "admin")},dispatcherTypes = DispatcherType.REQUEST)public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器");
System.out.println(filterConfig.getInitParameter("userName"));
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行url,进入此方法");
chain.doFilter(request,response);//进入下一个过滤器或url
}
@Override
public 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 {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext has create ...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext has destroyed ...");
}
}