目录
java过滤器能够对目标资源的请求和响应进行过滤/拦截。
javaweb 三大组件:servlet , filter , listener
生活中:净水器,空气净化器。。。
java中:登录验证,字符编码处理,敏感字符过滤等
共性特点:过滤的是每一次的请求和响应,意味着每一次的请求和响应一定要先走过滤器!
一般用于完成通过的操作。如:登录过滤,编码处理,敏感字符过滤等。

javaWeb三大组件:servlet (应用程序) , filter (过滤器), listener(监听器)
3.1 实现接口Filter
3.2 复写方法 chain.doFilter(req,resp);放行方法
3.3 配置访问拦截路径
注解配置

web.xml配置
- <filter>
- <filter-name>Filterfilter-name>
- <filter-class>com.wjk.filter.Filterfilter-class>
- filter>
- <filter-mapping>
- <filter-name>Filterfilter-name>
- <url-pattern>/LifeServleturl-pattern>
- filter-mapping>
web.xml的配置
过滤器的执行流程
客户端发出请求----》过滤器----》放行-----》请求的资源----》响应----》过滤器----》客户端
过滤器的生命周期
同servlet生命周期:
init():初始化
doFilter():放行方法
destroy():销毁方法 当服务器正常关闭时,执行。
过滤器配置详解
- 过滤路径配置
- 具体的资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录:/user/* 访问user目录下的所有资源时,过滤器会被执行
- 后缀名拦截:*.jsp / *.do 访问所有后缀名为.jsp .do时,过滤器会被执行
- 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
- 过滤方式配置(资源被访问的方式) 了解
- 注解:设置dispatcherTypes属性
- REQUEST:默认值 浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
web.xml配置
<filter> <filter-name>FilterDemo1filter-name> <filter-class>com.aaa.bai.filter.FilterDemo1filter-class> filter> <filter-mapping> <filter-name>FilterDemo1filter-name> <url-pattern>/*url-pattern> <dispatcher>REQUESTdispatcher> filter-mapping>
监听你的web应用,监听许多信息的初始化,销毁,增加,修改,删除值等
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理
二、监听器的分类
在一个web应用程序的整个运行周期内,web容器会创建和销毁三个重要的对象,
ServletContext,HttpSession,ServletRequest按监听的对象划分,可以分为:
*ServletContext对象监听器
*HttpSession对象监听器
*ServletRequest对象监听器
按监听的时间划分
*对象自身的创建和销毁的监听器
*对象中属性的创建和消除的监听器
*sessoin中某个对象的状态变化的监听器
注册监听器:

- <listener>
- <listener-class>com.wjk.listener.Listenerlistener-class>
- listener>
3.1 上下文监听
- @WebListener
- public class MyContextListener implements ServletContextListener {
- @Override
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- // 获取到上下文对象
- ServletContext application = servletContextEvent.getServletContext();
- System.out.println("上下文初始化"+application);
- }
-
- @Override
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
- System.out.println("上下文销毁");
- }
- }
3.2 session监听
- @WebListener
- public class MySessionListener implements HttpSessionListener {
- /**
- *
- * @param httpSessionEvent 事件参数,可以获取到被监听对象的数据信息
- */
- @Override
- public void sessionCreated(HttpSessionEvent httpSessionEvent) {
- System.out.println("session创建"+httpSessionEvent.getSession().getId());
- }
-
- @Override
- public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
- System.out.println("session销毁"+httpSessionEvent.getSession());
- }
- }
3.3 session中属性监听
- @WebListener
- public class MySessionAttributeListener implements HttpSessionAttributeListener {
- @Override
- public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
- System.out.println("session属性添加:"+httpSessionBindingEvent.getName());
- }
-
- @Override
- public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
- System.out.println("session属性移除:"+httpSessionBindingEvent.getName());
- }
-
- @Override
- public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
- System.out.println("session属性替换:"+httpSessionBindingEvent.getName());
- }
- }
在线人数统计:
1、先获取容器中的数量计数器,如果没有,创建存进去
2、每创建一个session,计数器加1
3、每销毁一个session,计数器减1
- @WebListener
- public class OnlineListener implements ServletContextListener, HttpSessionListener {
- ServletContext appliction;
- @Override
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- // 获取上下文对象
- appliction = servletContextEvent.getServletContext();
- // 是否有计数器
- if(appliction.getAttribute("count")==null){
- // 存进去,只执行一次
- appliction.setAttribute("count",0);
- }
- }
-
- @Override
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
- }
-
- @Override
- public void sessionCreated(HttpSessionEvent httpSessionEvent) {
- // 获取原来的计数器的值
- Integer count=Integer.valueOf(appliction.getAttribute("count").toString());
- count++;
- // 存进去
- appliction.setAttribute("count",count);
- }
-
- @Override
- public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
- Integer count=Integer.valueOf(appliction.getAttribute("count").toString());
- count--;
- appliction.setAttribute("count",count);
- }
- }