持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
Filter
其实在Filter内存马时候已经了解过,是一种Servlet的规范,在到达Servlet前进行的一段过滤
Servlet
@WebServlet("/demo01.do")
public class Demo01Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo01 service.....");
req.getRequestDispatcher("success.html").forward(req,resp);
}
}
Filter
@WebFilter("/demo01.do")
public class Demo01Filter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("helloA");
//放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("helloA2");
}
@Override
public void destroy() {
}
}
结果
根据图示在理解一下:
当访问/demo01.do时,首先会调用doFilter方法进行过滤,输出helloA,过滤后到达service()方法,之后通过过滤器放行,输出helloA2,再回显给客户端
filter中也可以使用通配符即:@WebFilter("*.do"),用这种方式来匹配以do结尾的请求
过滤链
分别定义三个:filter1、filter2、filter3,并在放行前后分别输出A1|A2、B1|B2、C1|C2,看一下调用后的结果:
结果
示意图
可以看到三个过滤器的执行过程,但这里引入了一个新问题:如何知道先执行那个过滤器?
- 如果采取的是注解的方式:过滤器链的拦截顺序是按全类名的先后顺序排序的
- 如果采取的是xml的方式:按照配置的先后顺序进行排序
Lisenter
顾名思义就是监听器,他能够监听一些事件从而来达到一些效果。在请求网站的时候, 程序先执行listener监听器的内容:Listener -> Filter -> Servlet
监听器列表
-
ServletContext,服务器启动和终止时触发
- ServletContextListener:监听ServletContext对象的创建和销毁的过程
- HttpSeesionListener:监听HttpSeesion对象的创建和销毁的过程
- ServletRequestListener:监听ServletRequest对象的创建和销毁的过程
-
Session,有关Session操作时触发
- ServletContextAttributeLisenter:监听ServletContext的保存作用域的改动(add、remove、replace)
- HttpSessionAttributeListener:监听HttpSession的保存作用域的改动(add、remove、replace)
- ServletRequestAttributeListener:监听ServletRequest的保存作用域的改动(add、remove、replace)
-
Request,访问服务时触发
- HttpSessionBindingListener -监听某个对象在session域中的创建与移除
- HttpSessionActivationListener -监听某个对象在session域中的序列化和反序列化