JavaWeb——Servlet的过滤器和监听器

JavaWeb——过滤器和监听器

  • Servlet 过滤器是从 Servlet 2.3 规范开始新增的功能,并在 Servlet 2.4 规范中得到增强,监听器可以监听到 Web 应用程序启动和关闭。创建过滤器和监听器需要继承相应的接口,并进行配置。

一、Servlet 过滤器

1、Servlet 过滤器为何物

  • Servlet 过滤器,打个比方来说,就像是一张滤网,过滤杂质,位于客户端到客户端所请求的目标资源之间。
  • Servlet 过滤器的主要作用就是对来自客户端的请求进行过滤处理,并将过滤后的请求转交给下一个资源。
  • 过滤器实质上是 Web 应用的一个组成部件,承担了 Web 应用安全的部分功能,阻止不合法的请求和非法的访问。

2、Servlet 过滤器核心对象

  • Servlet 过滤器的核心对象为三个接口对象,名为 Filter、FilterConfig 和 FilterChain,位于 javax.servlet 包中。
2.1、Filter
  • 每个过滤器对象都要直接或间接的实现 Filter 接口,Filter 有如下三个方法:
    方法作用
    public void init(FilterConfig config)throws ServletException过滤器初始化
    public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException过滤请求
    public void destroy()销毁过滤器对象
2.2、FilterConfig
  • FilterConfig 接口由 Servlet 容器实现,用于获取过滤器中的配置信息,其相应方法如下:
    方法作用
    public String getFilterName()获取过滤器的名字
    public ServletContext getServletContext()获取 Servlet 上下文
    public String getInitParameter(String name)获取过滤器的初始化参数值
    public Enmueration getInitParameterNames()获取过滤器的所有初始化参数
2.3、FilterChain
  • FilterChain 接口仍是由 Servlet 去实现,该接口只有一个 doFilter 方法。

3、Servlet 过滤器

3.1、示例
  • 首先创建一个 FilterTest.java 并继承 Filter 接口,可以使用 IDEA 的集成工具进行创建,代码如下:
    package com.lyq.ServletFilterSet;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    @WebFilter(filterName = "FilterTest")
    public class FilterTest implements Filter {
        private String testMsg;
        public void init(FilterConfig config) throws ServletException {
            testMsg = config.getInitParameter("test");
        }
    
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            HttpServletRequest request = (HttpServletRequest) req;
            ServletContext context = request.getSession().getServletContext();
            context.setAttribute("test", testMsg);
            chain.doFilter(req, resp);
        }
    }
    
  • 在 web.xml 的 <web-app> 里添加如下代码:
    <filter>
        <filter-name>FilterTest</filter-name>
        <filter-class>com.lyq.ServletFilterSet.FilterTest</filter-class>
        <init-param>
            <param-name>test</param-name>
            <param-value>御承扬的博客</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterTest</filter-name>
        <url-pattern>/FilterJSPSet/filterJSPTest.jsp</url-pattern>
    </filter-mapping>
    
  • 在项目文件树的 web 节点下新建一个 FilterJSPSet 文件夹,并在该文件夹下面新建一个 filterJSPTest.jsp 文件,在里面编辑如下代码:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>过滤器示例</title>
        <style type="text/css">
            body{
                background: #e3c5e9;
                align-items: center;
            }
        </style>
    </head>
    <body>
    <h2>欢迎访问,<br>
        这里是<%=application.getAttribute("test")%>
    </h2>
    </body>
    </html>
    
  • Tomcat 运行,并在浏览器地址栏 index 后面加 FilterJSPSet/filterJSPTest.jsp 打开页面显示如下:
    在这里插入图片描述
3.2、示例说明
(1)创建 Servlet 过滤器
  • 这一步主要就是新建一个 Filter 类,就是上述示例中的 FilterTest.java,该类体里有 init、doFilter 和 destroy 三个方法,分别对应 Filter 生命历程的初始化、业务逻辑和销毁,也就是说 doFilter 方法是最主要的
(2)Servlet 过滤器配置和映射
  • 这一步全在 web.xml 中进行,配置 Servlet 过滤器就是在 web.xml 文件中添加 <filter></filter> 标签,并在该标签里添加 <filter-name></filter-name> 子标签,这一个声明过滤器名称的标签,与之配套的是 <filter-class></filter-class> 标签,这是一个声明过滤器包括路径在内的完整类名的标签,而后根据需要可以对过滤器中的属性初始化,用的是 <init-param></init-param>,标签里用 <param-name></param-name> 和 <param-value></param-value> 初始化参数。
  • 映射过滤器则使用 <filter-mapping></filter-mapping> 标签,该标签里用 <filter-name></filter-name> 表明需要映射的过滤器是哪个,用 <url-pattern></url-pattern> 表面映射的路径。

上一篇

下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御承扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值