第 四 章 Filter( 过 滤 器 ) 样 题 A 卷 一 选 择 题 ( 每 小 题 2 分, 共 20 分 ) 1 下 面 选 项 中, 用 于 实 现 初 始 化 过 滤 器 的 方 法 是 ( ) A init(filterconfig filterconfig) B dofilter(servletrequest req,servletresponse resp,filterchain chain) C destroy() D init(servletconfig servletconfig) 2 下 面 选 项 中, 用 于 实 现 过 滤 器 拦 截 作 用 的 方 法 是 ( ) A service(servletrequest req,servletresponse resp,filterchain chain) B filter(servletrequest req,servletresponse resp,filterchain chain) C destroy() D dofilter(servletrequest req,servletresponse resp,filterchain chain) 3 下 列 选 项 中, 用 于 在 配 置 Filter 映 射 时 设 置 Filter 名 称 的 元 素 是 ( ) A <filter-mapping > B <url-pattern> C <filter > D <filter-name> 4 下 列 选 项 中, 用 于 在 配 置 Filter 映 射 时 设 置 Filter 类 完 整 名 称 的 元 素 是 ( ) A <filter-class > B <url-pattern> C <filter > D <filter-name> 5 下 列 选 项 中, 关 于 <dispatcher> 元 素 值 REQUEST 的 作 用, 描 述 正 确 的 是 ( ) A 当 用 户 直 接 访 问 页 面 时,Filter 将 调 用 B 目 标 资 源 通 过 RequestDispatcher 的 include() 方 法 时,Filter 将 调 用 C 目 标 资 源 通 过 RequestDispatcher 的 forward() 方 法 时,Filter 将 调 用 D 目 标 资 源 是 通 过 声 明 式 异 常 处 理 机 制 调 用 时, Filter 将 调 用 6 一 个 Web 应 用 程 序 中 Filter 可 以 注 册 的 次 数 是 ( ) A 只 能 是 1 次 B 只 能 是 0 次 C 只 能 是 0 次 或 1 次 D 只 能 是 2 次 7 下 列 选 项 中, 用 来 表 示 Filter 链 的 对 象 是 ( ) A Filter 对 象 B FilterConfig 对 象 C FilterChain 对 象 D ServletChain 对 象 8 下 面 选 项 中, 用 于 返 回 <filter-name> 元 素 设 置 值 的 方 法 是 ( ) A getservletcontext() B getfiltername() C getinitparameter(string name)
D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServletResponse D HttpServletResponseWrapper 10 下 列 选 项 中, 用 于 返 回 Filter 设 置 的 指 定 初 始 化 参 数 值 的 方 法 是 ( ) A getservletcontext() B getfiltername() C getinitparameter(string name) D getinitparameternames() 二 判 断 题 ( 每 题 2 分, 共 20 分 ) 1 Filter 可 以 实 现 用 户 在 访 问 某 个 目 标 资 源 之 前, 对 访 问 的 请 求 和 响 应 进 行 相 关 处 理 ( ) 2 编 写 完 过 滤 器 的 类 之 后, 不 需 要 对 该 过 滤 器 进 行 任 何 配 置, 就 可 以 让 其 拦 截 请 求 的 资 源 ( ) 3 Filter 的 元 素 可 以 配 置 过 滤 器 所 有 拦 截 的 资 源, 通 配 符 * 表 示 过 滤 器 拦 截 所 有 的 请 求 访 问 ( ) 4 Filter 链 中 各 个 Filter 的 拦 截 顺 序 与 它 们 在 web.xml 文 件 中 元 素 的 映 射 顺 序 一 致 ( ) 5 FilterConfig 接 口 的 getfiltername() 方 法 用 于 返 回 在 web.xml 文 件 中 为 Filter 所 设 置 的 名 称 ( ) 6 实 现 用 户 自 动 登 陆 会 使 用 到 Cookie 技 术 ( ) 7 装 饰 设 计 模 式 中, 包 装 类 的 内 部 持 有 一 个 被 包 装 类 的 对 象 ( ) 8 我 们 可 以 在 Filter 中 对 获 取 到 的 请 求 和 响 应 消 息 进 行 编 码, 从 而 统 一 全 站 的 编 码 方 式 ( ) 9 使 用 页 面 静 态 化 处 理 的 页 面 的 访 问 速 度 要 比 动 态 页 面 快 的 多, 因 此 它 提 高 了 程 序 性 能 ( ) 10 在 Filter 中 实 现 统 一 全 站 编 码 时, 对 于 请 求 方 式 post 和 get 解 决 乱 码 方 式 是 相 同 的 ( ) 三 程 序 分 析 题 ( 每 题 5 分, 共 15 分 ) 1 请 阅 读 下 面 的 程 序, 分 析 写 出 该 Filter 可 以 拦 截 的 URL( 至 少 写 出 两 个 答 案 ) <display-name>myfilter</display-name> <filter-name>myfilter</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter</filter-class> <filter-name>myfilter</filter-name> <url-pattern>/servlet/* </url-pattern> 2 请 阅 读 下 面 的 程 序, 分 析 当 客 户 端 访 问 HttpServlet1 时, 是 否 能 够 通 过 编 译, 如 果 能 编 译
通 过, 请 列 出 运 行 的 结 果 否 则 请 说 明 编 译 失 败 的 原 因 // Filter1 为 HttpServlet1 的 过 滤 器, 其 代 码 如 下 : public dofilter(servletrequest request,servletresponse response, FilterChain chain) throws IOException,ServletException{ System.out.print("one"); chain.dofilter(request,response); System.out.print("two"); // HttpServlet1 的 service() 方 法 的 代 码 如 下 : public void service(httpservletrequest request,httpservletresponse response) throws IOException,ServletException { System.out.print("before"); PrintWriter out = response.getwriter(); out.print("hello"); System.out.print("after"); 3 请 阅 读 下 面 的 程 序, 分 析 当 访 问 应 用 程 序 中 的 1.jsp 时, 程 序 是 否 能 够 通 过 编 译, 如 果 能 编 译 通 过, 请 列 出 过 滤 器 的 过 滤 顺 序 否 则 请 说 明 编 译 失 败 的 原 因 <filter-name>filter3</filter-name> <filter-class>cn.itcast.filter.filter3</filter-class> <filter-name>filter1</filter-name> <filter-class>cn.itcast.filter.filter1</filter-class> <filter-name>filter2</filter-name> <filter-class>cn.itcast.filter.filter2</filter-class> <filter-name>filter2</filter-name> <url-pattern>*.html</url-pattern> <filter-name>filter1</filter-name> <url-pattern>/*</url-pattern> <filter-name>filter3</filter-name> <url-pattern>*.jsp</url-pattern>
四 简 答 题 ( 每 题 5 分, 共 15 分 ) 1 简 述 过 滤 器 的 基 本 功 能 2 简 述 装 饰 设 计 模 式 的 特 点 3 简 述 Filter 实 现 页 面 静 态 化 的 优 点 ( 至 少 写 三 点 ) 五 操 作 题 ( 每 题 10 分, 共 30 分 ) 1 请 按 照 以 下 要 求 设 计 一 个 自 动 登 录 的 Filter 程 序 要 求 如 下 : 1) 已 知 在 客 户 端 保 存 好 了 名 为 autologin 的 cookie 用 户 信 息, 其 形 式 为 : username_password, 即 用 户 名 与 密 码 形 式, 他 们 之 间 用 _ 分 隔,Computer 类 中 定 义 一 个 静 态 方 法, 用 于 输 出 计 算 机 的 CPU 信 息 2) 登 录 用 户 信 息 :username 的 值 为 itcast, password 的 值 为 123456 3) 编 写 AutoLoginFilter.java 的 过 滤 器, 实 现 自 动 登 录 功 能 2 请 按 照 以 下 要 求 设 计 一 个 过 滤 器, 实 现 统 计 网 站 访 问 人 数 的 功 能 要 求 如 下 : 1) 过 滤 器 是 一 个 名 为 CountFilter 的 类, 此 类 实 现 javax.servlet.filter 接 口 2) 定 义 变 量 count 记 录 来 访 数 量, 并 在 web.xml 文 件 的 配 置 中 将 网 站 访 问 量 的 初 始 值 设 为 1000 3) 在 初 始 化 方 法 中, 通 过 FilterConfig 对 象 的 getintparameter() 方 法 获 取 访 问 数 量 参 数 4) 在 CountFilter 类 的 dofilter() 方 法 中, 对 count 变 量 进 行 自 增, 然 后 将 来 访 数 量 值 放 入 到 ServletContext 中, 向 下 传 递 过 滤 器 5) 创 建 index.jsp 页 面, 在 其 中 通 过 JSP 内 置 对 象 application 获 取 计 数 器 count 的 值, 动 态 显 示 最 新 的 访 问 人 数 3 请 按 照 以 下 要 求 设 计 一 个 Filter 链, 当 访 问 MyServlet 程 序 时, 可 以 顺 序 输 出 如 下 结 果 Hello MyFilter01 MyFilter02 Before Hello MyServlet MyFilter02 After 要 求 如 下 : 1) 创 建 MyServlet 类, 类 中 可 向 浏 览 器 输 出 Hello MyServlet 2) 创 建 MyFilter01 过 滤 器, 用 于 对 请 求 进 行 拦 截, 类 中 可 向 浏 览 器 输 出 Hello MyFilter01, 将 请 求 处 理 好 后, 调 用 Filter01 的 dofilter () 方 法, 将 请 求 传 递 给 MyFilter02 3) 创 建 MyFilter02 过 滤 器, 用 于 对 请 求 进 行 拦 截, 类 中 可 向 浏 览 器 输 出 MyFilter02 Before, 将 请 求 处 理 好 后, 调 用 Filter02 的 dofilter () 方 法, 将 请 求 传 递 给 MyServlet 类, 在 Filter02 的 dofilter () 方 法 后 向 浏 览 器 输 出 MyFilter02 After, 看 看 拦 截 器 的 执 行 顺 序 4) 创 建 web.xml 文 件, 在 文 件 中 对 过 滤 器 和 程 序 进 行 配 置
答 案 一 选 择 题 1.A 2.D 3.D 4.A 5.A 6.C 7.C 8.B 9.A 10.C 二 判 断 题 1.A 2.B 3.A 4.A 5.A 6.A 7.A 8.A 9.A 10.B 三 程 序 分 析 题 ------------------- 第 1 题 ------------------- 1 请 阅 读 下 面 的 程 序, 分 析 写 出 该 Filter 可 以 拦 截 的 URL 答 : 本 题 是 开 放 性 题 目, 答 案 不 唯 一 例 如 :http://localhost:8080/chapter04/servlet/myservlet http://localhost:8080/chapter04/servlet/01/myservlet ------------------- 第 2 题 ------------------- 2 请 阅 读 下 面 的 程 序, 分 析 当 客 户 端 访 问 HttpServlet1 时, 是 否 能 够 通 过 编 译, 如 果 能 编 译 通 过, 请 列 出 运 行 的 结 果 否 则 请 说 明 编 译 失 败 的 原 因 答 : 本 程 序 可 正 常 编 译 运 行 结 果 是 :one before after two ------------------- 第 3 题 ------------------- 3 请 阅 读 下 面 的 程 序, 分 析 当 访 问 应 用 程 序 中 的 1.jsp 时, 程 序 是 否 能 够 通 过 编 译, 如 果 能 编 译 通 过, 请 列 出 过 滤 器 的 过 滤 顺 序 否 则 请 说 明 编 译 失 败 的 原 因 答 : 本 程 序 可 正 常 编 译 运 行 结 果 是 :Filter1 Filter3 四 简 答 题 ------------------- 第 1 题 ------------------- 1 简 述 过 滤 器 的 基 本 功 能 答 :Filter 被 称 作 过 滤 器 或 者 拦 截 器, 其 基 本 功 能 就 是 对 Servlet 容 器 调 用 Servlet 的 过 程 进 行 拦 截, 从 而 在 Servlet 进 行 响 应 处 理 前 后 实 现 一 些 特 殊 功 能 ------------------- 第 2 题 ------------------- 2 简 述 装 饰 设 计 模 式 的 特 点 1. 包 装 类 要 和 被 包 装 对 象 实 现 同 样 的 接 口 2. 包 装 类 持 有 一 个 被 包 装 对 象 3. 包 装 类 中 对 于 不 需 要 包 装 的 方 法 直 接 调 用 被 包 装 对 象 的 方 法 来 实 现 4. 包 装 类 在 实 现 接 口 的 过 程 中, 对 于 需 要 包 装 的 方 法 自 己 实 现 ------------------- 第 3 题 ------------------- 3 简 述 Filter 实 现 页 面 静 态 化 的 优 点 ( 至 少 写 三 点 ) 1. 静 态 化 处 理 的 页 面 的 访 问 速 度 要 比 动 态 页 面 快 的 多, 因 此 提 高 了 程 序 性 能 2. 减 轻 数 据 库 访 问 压 力 3. 实 现 搜 索 引 擎 的 优 化
五 操 作 题 ------------------- 第 1 题 ------------------- 1 请 按 照 以 下 要 求 设 计 一 个 自 动 登 录 的 Filter 程 序 import java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; import javax.servlet.servletrequest; import javax.servlet.servletresponse; import javax.servlet.http.cookie; import javax.servlet.http.httpservletrequest; public class AutoLoginFilter implements Filter { public void init(filterconfig filterconfig) throws ServletException { public void dofilter(servletrequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; // 获 得 一 个 名 为 autologin 的 cookie Cookie[] cookies = request.getcookies(); String autologin = null; for (int i = 0; cookies!= null && i < cookies.length; i++) { if ("autologin".equals(cookies[i].getname())) { // 找 到 了 指 定 的 cookie autologin = cookies[i].getvalue(); break; if (autologin!= null) { // 做 自 动 登 录 String[] parts = autologin.split("-"); String username = parts[0]; String password = parts[1]; // 检 查 用 户 名 和 密 码 if ("itcast".equals(username) && ("123456").equals(password)) { // 登 录 成 功, 将 用 户 状 态 user 对 象 存 入 session 域 User user = new User(); user.setusername(username); user.setpassword(password); request.getsession().setattribute("user", user); // 放 行
chain.dofilter(request, response); public void destroy() { ------------------- 第 2 题 ------------------- 2 请 按 照 以 下 要 求 设 计 一 个 过 滤 器, 实 现 统 计 网 站 访 问 人 数 的 功 能 (1) 创 建 过 滤 器 CountFilter 类 package cn.itcast.filter; import java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletcontext; import javax.servlet.servletexception; import javax.servlet.servletrequest; import javax.servlet.servletresponse; import javax.servlet.http.httpservletrequest; /** * 统 计 网 站 访 问 人 数 的 过 滤 器 */ public class CountFilter implements Filter{ // 网 站 访 问 人 数 private int count; // 初 始 化 方 法 public void init(filterconfig filterconfig) throws ServletException { // 获 取 初 始 化 参 数 String param = filterconfig.getinitparameter("count"); // 将 字 符 串 转 换 为 int 类 型 count = Integer.valueOf(param); public void dofilter(servletrequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 访 问 人 数 自 增 count++; // 将 ServletRequest 转 换 为 HttpServletRequest HttpServletRequest req = (HttpServletRequest) request; // 获 取 ServletContext ServletContext context = req.getservletcontext(); //req.getsession().getservletcontext(); // 将 网 站 访 问 人 数 数 量 值 放 入 到 ServletContext 中 context.setattribute("count", count);
// 向 下 传 递 过 滤 器 chain.dofilter(request, response); // 销 毁 方 法 public void destroy() { (2) 在 web.xml 文 件 中 对 过 滤 器 进 行 配 置, 并 在 初 始 化 参 数 中, 将 网 站 访 问 量 的 初 始 值 设 为 1000, 关 键 代 码 如 下 : <!-- 过 滤 器 声 明 --> <!-- 过 滤 器 的 名 称 --> <filter-name>countfilter</filter-name> <!-- 过 滤 器 的 完 整 类 名 --> <filter-class>cn.itcast.filter.countfilter</filter-class> <!-- 设 置 初 始 化 参 数 --> <init-param> <!-- 参 数 名 --> <param-name>count</param-name> <!-- 参 数 值 --> <param-value>1000</param-value> </init-param> <!-- 过 滤 器 映 射 --> <!-- 过 滤 器 的 名 称 --> <filter-name>countfilter</filter-name> <!-- 过 滤 器 URL 映 射 --> <url-pattern>/index.jsp</url-pattern> (3) 创 建 index.jsp 页 面 <%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8" import="java.util.*"%> <html> <head> <title> 统 计 访 问 人 数 </title> </head> <body> <h2> 欢 迎 光 临,<br> 你 是 本 站 的 第 <%=application.getattribute("count") %> 位 访 客! </h2>
</body> </html> ------------------- 第 3 题 ------------------- 3 请 按 照 以 下 要 求 设 计 一 个 Filter 链, 当 访 问 MyServlet 程 序 时, 可 以 顺 序 输 出 如 下 结 果 (1) 创 建 MyFilter01 和 MyFilter02, 如 下 所 示 MyFilter01.java import java.io.*; import javax.servlet.*; public class MyFilter01 implements Filter { public void destroy() { // 过 滤 器 对 象 在 销 毁 时 自 动 调 用, 释 放 资 源 public void dofilter(servletrequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 用 于 拦 截 用 户 的 请 求, 如 果 和 当 前 过 滤 器 的 拦 截 路 径 匹 配, 该 方 法 会 被 调 用 PrintWriter out=response.getwriter(); out.write("hello MyFilter01</br>"); chain.dofilter(request, response); public void init(filterconfig fconfig) throws ServletException { // 过 滤 器 对 象 在 初 始 化 时 调 用, 可 以 配 置 一 些 初 始 化 参 数 MyFilter02.java import java.io.*; import javax.servlet.filter; import javax.servlet.*; public class MyFilter02 implements Filter { public void destroy() { // 过 滤 器 对 象 在 销 毁 时 自 动 调 用, 释 放 资 源 public void dofilter(servletrequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 用 于 拦 截 用 户 的 请 求, 如 果 和 当 前 过 滤 器 的 拦 截 路 径 匹 配, 该 方 法 会 被 调 用 PrintWriter out=response.getwriter(); out.write("myfilter02 Before</br>"); chain.dofilter(request, response); out.write("</br>myfilter02 After</br>"); public void init(filterconfig fconfig) throws ServletException { // 过 滤 器 对 象 在 初 始 化 时 调 用, 可 以 配 置 一 些 初 始 化 参 数
(2) 在 web.xml 文 件 中 MyFilter01 和 MyFilter02 注 册 在 MyServlet 前 面, 具 体 如 下 所 示 : <display-name>myfilter01</display-name> <filter-name>myfilter01</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter01</filter-class> <filter-name>myfilter01</filter-name> <url-pattern>/myservlet</url-pattern> <display-name>myfilter02</display-name> <filter-name>myfilter02</filter-name> <filter-class>cn.itcast.chapter04.filter.myfilter02</filter-class> <filter-name>myfilter02</filter-name> <url-pattern>/myservlet</url-pattern> <servlet> <display-name>myservlet</display-name> <servlet-name>myservlet</servlet-name> <servlet-class>cn.itcast.chapter04.filter.myservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myservlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> (3) 启 动 Tomcat 服 务 器, 在 浏 览 器 地 址 栏 中 输 入 http://localhost:8080/chapter04/myservlet, 进 行 访 问, 输 出 结 果