Filter

对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息。

在一个WEB应用中可以部署多个过滤器,多个过滤器就组成了一个过滤器链,请求和响应必须在经过多个过滤器后才能到达目标

当配置多个Filter以后就有一个执行顺序的问题,实际执行顺序是按照在web.xml文件中servlet-mapping的顺序决定的,如果顺序越靠前越先被调用。

Filter接口

  • Filter是一个接口。

  • Filter是Java Web三大组件之一。(JavaWeb三大组件分别是:Servlet小程序、Filter过滤器、Listener监听器)

  • 作用:1.检查用户访问权限

                2.设置请求响应编码,解决乱码问题

主要API

Filter

  • init(FilterConfig)方法用于初始化Filter

  • doFilter(ServletRequest,ServletResponse,FilterChain)作用和service()方法类似,是过滤请求和响应的主要方法。

  • destroy()用于在Filter对象被销毁前做一些收尾工作。如:释放资源等。

FilterConfig

FilterConfig对象在服务器调用init()方法时传递进来。

  • getFilterName() 获取Filter的名字

  • getServletContext() 获取ServletContext对象(即application)

  • getInitParameter(String) 获取Filter的初始化参数

  • getInitParameterNames() 获取所有初始化参数的名字

FilterChain

FilterChain对象是在doFilter()方法被调用时作为参数传递进来的。

  • doFilter(ServletRequest,ServletResponse)方法用于调用Filter链上的下一个过滤器,如果当前过滤器为最后一个过滤器则将请求发送到目标资源。

web.xml文件中的Filter配置

<filter-mapping>
<!-- Filter的名字 -->
<filter-name>Filter1</filter-name>
<!-- Filter1的过滤地址,表示过滤http://127.0.0.1:8080/day17/admin/user.jsp-->
<url-pattern>/admin/user.jsp</url-pattern>
</filter-mapping>

除此之外在filter-mapping还有一个子标签dispatcher,该标签用来指定需要Filter处理的请求类型

<!-- 用户直接访问资源时,会调用Filter -->
<dispatcher>REQUEST</dispatcher> <!-- 通过转发访问时,会调用Filter -->
<dispatcher>FORWARD</dispatcher> <!-- 通过动态包含获取时,会调用Filter -->
<dispatcher>INCLUDE</dispatcher> <!-- 当通过异常处理访问页面时,会调用Filter -->
<dispatcher>ERROR</dispatcher>

这四种情况可以设置一个,也可以同时设置多个,如果不设置那么默认为REQUEST

Filter生命周期

  1. 先执行Filter的构造方法

  2. 然后执行Filter的init()方法,对象创建后,马上就被调用,对Filter做一些初始化操作

  3. 执行Filter的doFilter()方法,每次访问目标资源,只要匹配过滤的地址,就会调用。

  4. 执行Filter的destroy()方法,服务器停止时调用,用来释放资源。

FilterConfig类

作用:

  • 获取Filter在web.xml文件中配置的名称

  • 获取Filter在web.xml文件中配置的初始化参数

  • 通过FilterConfig类获取ServletContext对象实例

    // 获取Filter的名称
    String filterName = filterConfig.getFilterName();// 获取初始化参数。username的值
    String username = filterConfig.getInitParameter("username");// 获取ServletContext的对象实例
    ServletContext ctx = filterConfig.getServletContext();

FilterChain过滤器链

  • FilterChain是整个Filter过滤器的调用者。Filter与Filter之间的传递,或者Filter与请求资源之间的传递都靠FilterChain.doFilter方法。

  • 一般Filter.doFilter中的代码分为三段:

    • 第一段是FilterChain.doFilter之前的代码。一般用来做请求的拦截,检查用户访问的权限,访问日记的记录。参数编码的设置等等操作。

    • 第二段是FilterChain.doFilter方法。此方法可以将代码的执行传递到下一个Filter中。或者是传递到用户最终访问的资源中。

    • 第三段是FilterChain.doFilter之后的代码。主要用过做一些日志操作。我们很少会在第三段中做太多复杂的操作。

  • 在每一个Filter类的doFilter方法中,一定要调用chain.doFilter方法,除非你想要阻止用户继续往下面访问。否则一定要调用FilterChain的doFilter方法。

Filter的拦截路径

主要有以下两种

  • 第一种:通过filter-mapping的url-pattern来配置(与Servlet的url-pattern的规则相同)

    • 精确匹配:/路径/资源名

      比如:/index.html、/hello/index.jsp 、 /client/LoginServlet 等,只有在请求地址完全一样时才会调用Filter

    • 目录匹配:/路径名/*

      比如1:/abc/* 表示可以拦截abc目录下的所有资源,甚至是abc目录下的其他目录。

      比如2:/* 表示只要访问项目根目录下的资源就会调用Filter

    • 后缀名匹配:*.后缀名

      比如:*.jsp 表示拦截所有后缀为jsp文件资源

  • 第二种:通过filter-mapping中的servlet-name来指定要过滤的Servlet

在Filter的filter-mapping中增加了一个servlet-name标签,将该标签的值设置成Servlet的名字,在访问Servlet时就会调用该过滤器过滤请求。
  <filter-mapping>
<filter-name>HelloFilter</filter-name>
<servlet-name>HelloServlet</servlet-name>
</filter-mapping>

Listener

Listener用于监听JavaWeb程序中的事件,当事件被触发时,监听器中的指定方法将会被调用。

监听对象的创建与销毁

  • ServletContextListener

    • 作用:监听ServletContext对象的创建与销毁

    • 方法:

      public void contextInitialized ( ServletContextEvent sce ):ServletContext创建时调用

      public void contextDestroyed ( ServletContextEvent sce ):ServletContext销毁时调用

    • ServletContextEvent对象

      • 作用:public ServletContext getServletContext ():获取ServletContext对象

  • HttpSessionListener

    • 作用:监听HttpSession对象的创建与销毁

    • 方法:

      • public void sessionCreated ( HttpSessionEvent se ):HttpSession对象创建时调用

      • public void sessionDestroyed ( HttpSessionEvent se ):HttpSession对象销毁时调用

    • HttpSessionEvent对象

      • 作用:public HttpSession getSession ():获取当前HttpSession对象

  • ServletRequestListener

    • 作用:监听ServletRequest对象的创建与销毁

    • 方法:

      • public void requestInitialized ( ServletRequestEvent sre ):ServletRequest对象创建时调用

      • public void requestDestroyed ( ServletRequestEvent sre ):ServletRequest对象销毁时调用

    • ServletRequestEvent对象

      • 作用:

        public ServletRequest getServletRequest ():获取当前的ServletRequest对象。

        public ServletContext getServletContext ():获取当前项目的ServletContext对象。

三种创建与销毁的监听器使用起来基本一致。

在web.xml文件中注册监听器

<listener>
<listener-class>com.web.listener.MyServletContextListener</listener-class>
</listener>

监听对象的属性变化

  • ServletContextAttributeListener

    • 作用:监听ServletContext中属性的创建、修改和销毁

    • 方法:

      public void attributeAdded(ServletContextAttributeEvent scab):向ServletContext中添加属性时调用

      public void attributeRemoved(ServletContextAttributeEvent scab):从ServletContext中移除属性时调用

      public void attributeReplaced(ServletContextAttributeEvent scab):当ServletContext中的属性被修改时调用

    • ServletContextAttributeEvent对象

      • 作用:

        public String getName() :获取修改或添加的属性名

        public Object getValue():获取被修改或添加的属性值

        public ServletContext getServletContext ():获取当前WEB应用的ServletContext对象

  • HttpSessionAttributeListener

    • 作用:监听HttpSession中属性的创建、修改和销毁

    • 方法:

      public void attributeAdded ( HttpSessionBindingEvent se ):向HttpSession中添加属性时调用

      public void attributeRemoved(HttpSessionBindingEvent se):从HttpSession中移除属性时调用

      public void attributeReplaced(HttpSessionBindingEvent se):当HttpSession中的属性被修改时调用

    • HttpSessionBindingEvent对象

      • 作用:

        public String getName() :获取修改或添加的属性名

        public Object getValue():获取被修改或添加的属性值

        public HttpSession getSession ():获取当前的HttpSession对象

  • ServletRequestAttributeListener

    • 作用:监听ServletRequest中属性的创建、修改和销毁

    • 方法:

      public void attributeAdded (ServletRequestAttributeEvent srae ):向ServletRequest中添加属性时调用

      public void attributeRemoved(ServletRequestAttributeEvent srae):从ServletRequest中移除属性时调用

      public void attributeReplaced(ServletRequestAttributeEvent srae):当ServletRequest中的属性被修改时调用

    • ServletRequestAttributeEvent对象

      • 作用:

        public String getName():获取修改或添加的属性名

        public Object getValue():获取被修改或添加的属性值

        public ServletRequest getServletRequest () :获取当前的ServletRequest对象

监听Session内的对象

  • HttpSessionBindingListener

    • 作用:监听某个对象在session域中的创建与移除。

    • 方法:

      public void valueBound(HttpSessionBindingEvent event):该类的实例被放到Session域中时调用

      public void valueUnbound(HttpSessionBindingEvent event):该类的实例从Session中移除时调用

    • HttpSessionBindingEvent对象

      • 作用:

        public HttpSession getSession ():获取HttpSession对象

        public String getName():获取操作的属性名

        public Object getValue():获取操作的属性值

  • 使用:要监听哪一个类,直接使该类实现HttpSessionBindingListener接口即可。

  • HttpSessionActivationListener

    • 作用:监听某个对象在session中的序列化与反序列化。

    • 方法:

      public void sessionWillPassivate(HttpSessionEvent se):该类实例和Session一起钝化到硬盘时调用

      public void sessionDidActivate(HttpSessionEvent se):该类实例和Session一起活化到内存时调用

    • HttpSessionEvent对象

      • 作用:

        public HttpSession getSession ():获取HttpSession对象

  • 使用:要监听哪一个类,直接使该类实现HttpSessionActivationListener接口即可。

注意:为被监听类对象可以正常序列化到硬盘上,还需要让该类实现java.io.Serializable接口

Web基础了解版10-Filter-Listener的更多相关文章

  1. Web基础了解版03-jQuery

    jQuery jQuery,顾名思义,也就是JavaScript和查询(Query)极大地简化了JavaScript开发人员遍历HTML文档.操作DOM.处理事件.执行动画和开发Ajax. jQuer ...

  2. Web基础了解版04-XML-Tomcat-Http

    XML 什么是XML - Tomcat - Http XML:eXtensible Markup Language (可扩展标记语言). XML 是一种标记语言,很类似 HTML. XML 的设计宗旨 ...

  3. Web基础了解版07-EL表达式-运算符-11个隐式对象

    EL EL(Expression Language)是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进 ...

  4. Web基础了解版02-JavaScript

    JavaScript 特性 ① 解释型语言.JavaScript是一种解释型的脚本语言,JavaScript是在程序的运行过程中逐行进行解释,不需要被编译为机器码再执行. ② 面向对象.JavaScr ...

  5. Web基础了解版05-Servlet

    Servlet Servlet? 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案.而具体的Servlet容器负责提 ...

  6. Web基础了解版06-Jsp

    Jsp Jsp全称Java Server Pages,也就是在我们JavaWeb中的动态页面. Jsp能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML. Jsp其本质就是一个Se ...

  7. Web基础了解版12-上传下载

    上传 两个步骤: 用户在页面中选择要上传的文件,然后将请求提交到Servlet Servlet收到请求,解析用户上传的文件,然后将文件存储到服务器 上传文件表单 <form action=&qu ...

  8. Web基础了解版09-Cookie-Session

    Cookie Cookie 是一种服务器发送给浏览器以键值对形式存储小量信息的技术. 当浏览器首次请求服务器时,服务器会将一条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存 ...

  9. Web基础了解版01-html-css

    HTML 网页构成 摘要 说明 结构(HTML) HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 表现(CSS) CSS样式是表现.就像网页的 ...

随机推荐

  1. css3 练习

    css3 文本效果 css3中包含几个新的文本特征 在本章中您将了解一下文本属性 text-shadow box-shadow word-wrap word-break css3 的文本阴影 css3 ...

  2. TensorFlow 池化层

    在 TensorFlow 中使用池化层 在下面的练习中,你需要设定池化层的大小,strides,以及相应的 padding.你可以参考 tf.nn.max_pool().Padding 与卷积 pad ...

  3. @bzoj - 4377@ [POI2015] Kurs szybkiego czytania

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n, a, b, p,其中 n, a 互质.定义一个长度为 ...

  4. behavior planning——inputs to transition functions

    the answer is that we have to pass all  of the data into transition function except for the previous ...

  5. hdu 2225 The nearest fraction (数学题)

    Problem - 2225 一道简单数学题,要求求出一个分母不超过m的最接近sqrt(n)的分数. 做法就是暴力枚举,注意中间过程不能用浮点数比较,误差要求比较高. 代码如下: #include & ...

  6. 【CSS3】分类豆腐块菜单浮动效果

    HTML <html> <head> <title></title> <style type="text/css"> # ...

  7. 原生js实现最简单的瀑布流布局

    文章地址 https://www.cnblogs.com/sandraryan/ 瀑布流:瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动, ...

  8. Java JDBC学习实战(一): JDBC的基本操作

    一.JDBC常用接口.类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令.API常用的类.接口如下: DriverManager,管理JDBC驱动的服务类,主要通过它获取Connect ...

  9. pytorch 状态字典:state_dict 模型和参数保存

    pytorch 中的 state_dict 是一个简单的python的字典对象,将每一层与它的对应参数建立映射关系.(如model的每一层的weights及偏置等等) (注意,只有那些参数可以训练的l ...

  10. Python--day66--模板语言之fitler回顾