一、Filter
1、过滤器是什么
Filter过滤器是JavaEE规范,是一个接口
2、有什么用
Filter可以在Servlet目标程序执行前添加代码拦截请求,也可以在目标程序执行后添加代码过滤响应
3、Filter过滤器体验
没用Filter过滤器时,需要在每个Servlet中加同样的登录判断代码,才能拦截没有登录的用户访问部门列表,用了Filter过滤器后只需要在过滤器中添加一次拦截代码。
没用过滤器拦截时,直接在地址栏输入访问地址,没有登录也可以访问,左上角用户信息为null
用了过滤器后
直接输入访问部门列表的地址会被拦截跳转到登录界面,登录后才能访问
使用步骤:
1、实现Filter接口,并重新所有的方法
init方法(服务器启动时Filter创建执行一次)
doFilter方法(过滤方法,用户访问时执行)
destroy方法(关闭服务器是Filter销毁执行一次)
2、编写dilterChain.doFilter()方法
public class Filter1 implements Filter {
@Override
//Filter对象创建是执行一次
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter1创建");
}
@Override
//用户请求时执行,请求n次执行n次
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("doFilter()执行");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("doFilter()执行完");
}
@Override
//Filter对象销毁时执行一次
public void destroy() {
System.out.println("destroy()执行");
}
}
3、web.xml中配置Filter
- Filter执行步骤
Filter的优先级比Servlet高,在服务器启动时创建Filter对象执行Filter中的init()方法,当用户发送请求时会先执行Filter中的doFilter()方法,然后执行下一个过滤器如果没有,则会执行目标程序(注意:需要在doFilter()中写filterChain.doFilter(servletRequest,servletResponse)否则不会执行),目标程序执行完后会回到上一级Fiter中的doFilter()直到doFilter()执行完。Filter对象销毁时执行destroy()。
多个过滤器执行顺序:web.xml配置执行顺序是按照<filter-mapping></filter-maping>从上到下执行
注解是过滤器名称安装字典顺序执行
过滤器的请求路径和目标程序的请求路径要相符
Listener
- 什么是监听器
在Servlet中监听器接口都是以Listener结尾,属于Servlet规范中的一员
- 监听器有什么用
Servlet规范留给程序员的一个特殊时机,当程序员想要在这个特殊时机执行代码时使用监听器
- Servlet规范中有哪些监听器
jakarta.servlet包下
ServletContextListener (onteServletCxt对象创建或销毁时执行)
ServletContextAttributeListener(向ServletContext保存删除替换数据时执行)
ServletRequestListener
ServletRequestAttributeListener
jakarta.servlet.http包下
HttpSessionListener
HttpSessionAttributeListener(需要@WebListener标注,只要session中的数据变化就执行相应方法,主要监听session域上对象)
HttpSessionBindingListener(不需要@WebListener标注,把相应的对象添加到session或从session中删除时执行,比如User类实现了这个监听器,只有User对象保存到session或User对象从session中删除,才会执行相应的方法)
HttpSessionIdListener
HttpSessionActivationListener - 如何实现一个监听器
1、编写一个类实现一个监听器接口,并实现里面的方法
2、在web.xml文件中用<listener><listener-class>含包名的类名</listener-class></listener>
用注解比较简单@WebListener
注意:实现HttpSessionBindingListener时不需要进行监听器配置,只需实现即可。
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁");
}
}
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("ServletContext存数据");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("ServletContext删除数据");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("ServletContext替换数据");
}
}
public class User implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("绑定数据");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("解绑数据");
}
}
所有监控器中的方法都不需要程序员去调用,当某个特殊的事件发生时,web服务器自动调用