一.监听器
1.是javaweb的三大组件之一,分别是Servlet程序,Listener监听器,Filter过滤器
2.Listener是JvaEE的规范,就是接口,监听器的作用就是监听某种变化(一般是对象创建/销毁,属性变化),触发对应方法完成相应的任务
3.ServletContextListener:
/*当一个类实现了ServletContextListener,该类就是一个监听器* 该类可以监听的事件由该类实现的接口决定,比如下面该类就能监听ServletContext对象的创建和销毁* 当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法contextInitialized* 同时会传递事件对象,程序员通过ServletContextEvent事件对象来获取需要的信息,然后处理业务* tomcat怎么知道这个监听器存在? 因为需要在web.xml文件中配置*/
public class HspServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {ServletContext servletContext = servletContextEvent.getServletContext();System.out.println("该监听器监听到"+servletContext+"被创建");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {ServletContext servletContext = servletContextEvent.getServletContext();System.out.println("该监听器监听到"+servletContext+"被销毁");}
}
4.ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext的属性变化
public class HspServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener监听到添加属性"+servletContextAttributeEvent.getName()+"" +"="+servletContextAttributeEvent.getValue());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener监听到删除属性"+servletContextAttributeEvent.getName()+"" +"="+servletContextAttributeEvent.getValue());}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener监听到替换属性"+servletContextAttributeEvent.getName()+"" +"="+servletContextAttributeEvent.getValue());}
}
5.HttpSessionListener
HttpSessionListener即生命周期监听,用于监听用户的上线或者离线
public class HspServletSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();session.setMaxInactiveInterval(20);//设置session生命周期System.out.println("HspServletSessionListener监听到了session的创建id为"+session.getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();System.out.println("HspServletSessionListener监听到了session的销毁:"+session.getId());}
}
6.HttpSessionAttributeListener 用于监听session属性的变化
7.ServletRequestListener监听器用于监听Request创建或者销毁,即Request生命周期监听,也是监控某个ip访问网站的频率,记录访问日志
8.ServletRequestAttributeListener监听器用于监听request属性变化
二.过滤器
1.过滤器是JavaEE的规范,是接口.作用是拦截请求,过滤响应基本原理如下
请求转发方式不会经过过滤器
当客户端发送一个请求到 Tomcat 服务器时,请求会先经过 Filter 的 doFilter 方法进行预处理。在 doFilter 方法中,可以对请求进行修改,如设置字符编码、验证用户权限等。然后调用 FilterChain 的 doFilter 方法将请求传递给下一个 Filter 或 Servlet 进行处理。当 Servlet 处理完请求并生成响应后,响应会再次经过 Filter 的 doFilter 方法进行后处理,最后返回给客户端。
public class ManageFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//当Tomcat创建Filter实例后,就会调用filter的无参构造器,调用该nint方法进行初始化.System.out.println( "ManageFilter init方法被调用");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//当每次调用该filter时,就会调用该方法System.out.println("doFilter被调用");//继续访问目标资源,在调用过滤器前,servletRequest对象=request已经被创建并且封装//所以就可以通过servletRequest获取很多信息,比如访问url,session//获取sessionHttpSession session = ((HttpServletRequest) servletRequest).getSession();if(session.getAttribute("username")!=null){//下面这个语句相当于放行filterChain.doFilter(servletRequest,servletResponse);}else {//没有登陆过,回到登录页面\servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);}}@Overridepublic void destroy() {
//每次销毁filter时,就会调用该方法System.out.println("ManageFilter被销毁");}
}
2.Filter生命周期
当Tomcat创建Filter实例(只会创建一个,并且常驻内存)后,就会调用filter的无参构造器,调用该nint方法进行初始化.同时tomcat创建一个FilterConfig对象同时通过init方法传入
当一个http请求和该filter的url-patter匹配时,就会调用doFilter方法,同时会创建servletRequest,servletResponse,filterChain,通过doFilter传入,后面的请求资源若使用到requst和response,则是同一个会继续传递使用.停止web工程,销毁Filter就是调用destory
3.FilterConfig
FilterConfig是Filter过滤器的配置类,Tomcat每次创建Filter的时候,也会创建一个FilteConfig对象,这里包含了filter配置文件的配置信息
!--配置的参数,由程序员自己设计--><init-param><param-name>ip</param-name><param-value>127.0</param-value></init-param><init-param><param-name>port</param-name><param-value>8888</param-value></init-param></filter><filter-mapping><filter-name>HspFilterConfig</filter-name><url-pattern>/abc/*</url-pattern></filter-mapping>
public class HspFilterConfig implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//通过filterConfig获取相关的参数//获取filter的名字,ipString filterName = filterConfig.getFilterName();String ip = filterConfig.getInitParameter("ip");ServletContext servletContext = filterConfig.getServletContext();//可以获取到该Filter所有的配置参数名Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();//遍历枚举while(initParameterNames.hasMoreElements()){System.out.println("名字是:"+initParameterNames.hasMoreElements());}System.out.println("fileName="+filterName);System.out.println("ip="+ip);System.out.println("servletContext="+servletContext)}
}
4.过滤器链
流程图:
注意事项: