public interface Filter { default void init(FilterConfig filterConfig) throws ServletException { } void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; default void destroy() { }}@WebFilter("/*")public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //在Filter对象第一次被创建的时候调用,并且只调用一次 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //doFilter()只要用户发送一次请求,则执行一次,发送N次,则执行N次。在这个方法中编写过滤规则 System.out.println("doFilter方法,前1"); //解决跨域问题 HttpServletResponse resp = (HttpServletResponse) servletResponse; resp.setHeader("Access-Control-Allow-Origin", "*"); resp.setHeader("Access-Control-Allow-Headers", "*"); resp.setHeader("Access-Control-Allow-Method", "*"); //执行下一个过滤器,如果说下一个不是过滤器,则会执行servlet filterChain.doFilter(servletRequest,servletResponse); System.out.println("doFilter方法,后1"); } @Override public void destroy() { //在Filter对象被释放/销毁之前调用,并且只调用一次 System.out.println("destroy方法"); }}init方法:在Filter对象第一次被创建的时候调用,并且只调用一次
doFilter方法:只要用户发送一次请求,则执行一次,发送N次,则执行N次。在这个方法中编写过滤规则
destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次
filterChain.doFilter(request, response);执行下一个过滤器,如果下一个不是过滤器,则执行Servlet
目标Servlet是否执行取决于两个条件:
filterChain.doFilter(request, response);注意:
<filter-mapping>的先后。

//模仿栈//模仿Filter设计模式//缺点:在编译阶段已经完全确定了调用关系//如果想要改变调用顺序,必须要修改java代码//违背了OCP原则(开闭原则)public class Test { public static void main(String[] args) { System.out.println("main方法执行"); m1(); System.out.println("main执行完毕"); } public static void m1() { System.out.println("m1方法执行"); m2(); System.out.println("m1执行完毕"); } public static void m2() { System.out.println("m2方法执行"); m3(); System.out.println("m2执行完毕"); } public static void m3() { System.out.println("目标正在执行中"); }}
@WebListenerpublic class MyListener01 implements HttpSessionAttributeListener { //监听session行为的监听器 @Override public void attributeAdded(HttpSessionBindingEvent se) { System.out.println("add"); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { System.out.println("removed"); } @Override public void attributeReplaced(HttpSessionBindingEvent se) { System.out.println("replaced"); }}@WebListenerpublic class MyListener implements ServletContextListener { //监听整个servlet生命周期的监听器 @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("contextInitialized"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed"); }}