JavaEE-拦截器和过滤器
过滤器(Filter):
过滤器 JavaWeb 三大组件之一,它与 Servlet 很相似!过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个 Servlet 时,会先执行部署在这个请求上的 Filter,如果 Filter “放行”,那么会继承执行用户请求的 Servlet;如果 Filter 不 “放行”,那么就不会执行用户请求的 Servlet。
其实可以这样理解,当用户请求某个 Servlet 时,Tomcat 会去执行注册在这个请求上的 Filter,然后是否 “放行” 由 Filter 来决定。可以理解为,Filter 来决定是否调用 Servlet!当执行完成 Servlet 的代码后,还会执行 Filter 后面的代码。
一,拦截资源路径
二,资源放行
1
| filterChain.doFilter(servletRequest, servletResponse);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.example.filter; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/*") public class Filter implements javax.servlet.Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init filter"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("正在拦截"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { System.out.println("destroy filter"); } }
|
过滤器应用场景
1, 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;
2,通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户 IP 是否已经被禁用;
3,在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;
监听器(Listen)
监听 ServletContext,HttpSession,ServletRequest 等域对象创建和销毁事件
监听域对象的属性发生修改的事件
监听 ServletContext,HttpSession,ServletRequest 等域对象创建和销毁事件
监听域对象的属性发生修改的事件
用途:
- 统计在线人数和用户
- 系统启动的时候加载初始化信息
- 统计网站的访问量
- 和 Spring 结合
- 监听器分类:
监听器分类:
(1)第一类:按照被监听的对象划分:ServletContext 域、ServletRequest 域、HttpSession 域。
(2)第二类:监听的内容划分:监听域对象的创建与销毁的监听域对象的属性变化的。
ServletContextListener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package zzs.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @WebListener public class FirstServletContextListener implements ServletContextListener{ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("servletcontext初始化了"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("servletcontext销毁了"); } }
|
HttpSessionListener
监听 Httpsession 域的创建于销毁的监听器 HttpSessionListener。
HttpSession 对象的生命周期:
(1)创建:第一次调用 request.getSession 时创建。
(2)销毁:服务器关闭销毁 session 过期手动销毁。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package zzs.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionBindingEvent; @WebListener() public class FirstHttpSessionListener implements HttpSessionListener { public FirstHttpSessionListener() { } public void sessionCreated(HttpSessionEvent se) { System.out.println("session创建id:"+se.getSession().getId()); } public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session销毁"); } }
|
ServletRequestListener
ServletRequestlistener 监听 ServletRequest 域创建与销毁的监听器 ServletRequestListener
ServletRequest 的生命周期
(1)创建:每一次请求都会创建 request
(2)销毁:请求结束