Filter

一、简介

  Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩相印信息等一些高级功能。

  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。

  Filter接口共定义了如下方法:

  destroy()、doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)、init(FilterConfig filterConfig);

二、filter在开发中的常见应用

  1、filter可以在目标资源执行之前,运行权限检查,检查用户有无权限。选择是否放行。

  2、filter可以在放行之前,对request和response进行预处理,从而实现一些全局性的设置。

  3、filter在放行之后,可以捕获到目标资源的输出,从而对输出做类似于压缩这样的设置。

三、filter链

  多个filter组成filter链。按顺序依次执行。

  执行先后次序按照web.xml中<filter-mapping>位置的先后顺序。

四、filter生命周期

  init()方法执行时filter创建,服务器在启动时就执行filter的init()方法创建了该filter对象,该对象被所有的拦截请求所共享。

  distroy()方法执行时filter被摧毁,当移除服务器中的web应用或者停止服务器时服务器调用distroy()方法摧毁filter。

五、filter()初始化参数

  <filter><init-param><param-name></><param-value></></></>

  服务器启动时会将参数封装到filterConfig中并传递给init方法,供filter调用。

六、filter增强

  对一个对象增强一般共有如下三种方式:

  1、写子类

  2、用包装模式

  3、动态代理

   包装模式五步:1、写一个类,实现与被增强对象相同的接口;2、定义一个变量,记住被增强对象;3、定义一个构造方法,接受被增强对象;4、覆盖需要增强的方法;5、对于不需要增强的方法,直接调用被增强对象(目标对象)的方法

  可使用包装模式实现对doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)中的ServeltRequest、ServletResponse对象增强;

  例如对ServletRequest的getParamter()方法增强来解决全栈的get方式的请求的乱码问题;

 七、Filter映射<dispatcher>

  filter配置中<filter-mapping>中可包含<dispatcher>元素,该元素用于指定过滤器拦截的资源被Servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定Filter对资源的多种调用方式进行拦截。

  web资源调用共四种方式,即上述四种,

  REQUEST拦截器介于服务器与request请求的资源之间,该拦截器作用于request请求资源时。

  INCLUDE,FORWARD拦截器介于服务器与被包含的资源及转发的资源之间,该拦截器作用于访问资源中有include、forward标志时服务器调用指定页面(资源)。

  ERROR拦截器介于服务器与错误资源之间,该拦截器作用于访问资源发生错误并向服务器抛出异常时,服务器调用对应的错误处理页面(资源)。

转载于:https://www.cnblogs.com/songpanyard/p/8471144.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试手写题

深拷贝 // 深拷贝 function deepClone(ori) {let tar;if (typeof ori object && ori ! null) {tar Array.isArray(ori) ? [] : {}for (let k in ori) {if (ori.hasOwnProperty(k)) {tar[k] deepClone(ori[k])}}} else {tar ori}return tar}继承 // 圣杯模式实现…

node --- 使用express.Router与body-parser

express框架提供了一个Router方法,用于监听路由 // 命令行(windows*64) npm install express --save// router.js const express require("express"); // 定义路由 const router express.Router();// 处理http://host:port/students/ 路由(GET方法) router.get…

python基础1 第一天

TEST 1 阿斯蒂芬 day1test1 while 1&#xff1a;print&#xff08;333&#xff09; import randomprint转载于:https://www.cnblogs.com/shuangzhu/p/9243853.html

【数据库】《SQL必知必会 4th》部分笔记

9.汇总数据 count(*) 包括空 count(name) 不包括空 10.分组数据 group by 分组 having 过滤分组 where 过滤行 11.子查询 select .. from .. where in (select ...) 由内向外处理 A.子查询过滤 作为子查询的语句只能查询单个列。 B.作为计算字段使用子查询 select cust_name, …

微软认知服务应用秘籍 – 漫画翻译篇

概述 微软认知服务包括了影像、语音、语言、搜索、知识五大领域&#xff0c;通过对这些认知服务的独立或者组合使用&#xff0c;可以解决很多现实世界中的问题。作为AI小白&#xff0c;我们可以选择艰难地攀登崇山峻岭&#xff0c;也可以选择像牛顿一样站在巨人的肩膀上。本章节…

01 React初步认知、React元素、渲染、工程化

定义 react&#xff1a;用于构建用户界面的 JavaScript 库 &#xff08;仅负责View层渲染、应在视图上体现交互逻辑&#xff09;vue&#xff1a;渐进式JavaScript 框架&#xff08;MVVM&#xff09; 使用 引入CDN脚本添加根容器 div #app创建React组件 ReactDOM.render Re…

node --- 在express中配置使用模板引擎(art-template)

下载依赖: npm install --save art-template express-art-template配置: // app.js const express require("express"); const app express(); app.engine("html", require("express-art-template"));使用: 例如处理浏览器GET请求 /students…

PAM认证机制

一、PAM简介 Sun公司1995年开发的一种与认证相关的通用框架机制&#xff0c;PAM只关注如何为服务验证用户的API&#xff0c;通过提供一些动态链接库和一套统一的API&#xff0c;将系统提供的服务和该服务的认证方式分开&#xff1b;PAM只是一个框架而已&#xff0c;自身不做认证…

02 JSX学习

使用vite处理jsx vite引入的脚本必须是ESM的 npm init -y yarn add vite package.json 添加vite命令 index.html引入jsxJSX是什么 一种标签语法&#xff0c;在JS基础上进行的语法扩展不是字符串、也不是HTML是描述UI呈现与交互的直观的表现形式JSX被编译后会生成React元素 &am…

使用FreeCookies 控制浏览器cookies及修改http响应内容

FreeCookies 插件安装 1&#xff1a;您的计算机需要已经安装Fiddler &#xff08;如未安装&#xff0c;请至官网下载安装 http://docs.telerik.com/fiddler/configure-fiddler/tasks/configurefiddler&#xff09; 2&#xff1a;进入Fiddler安装目录下的Scripts目录下&#xff…

node --- 使用node连接mysql

1.确保下载了mysql,且mysql处于打开状态. 2.确保下载了node,并成功安装:https://nodejs.org/en/ (小黑窗 node -v 查看) 3.安装node操作mysql的依赖包: # 命令行 npm install --save -mysql# 注:如果没有package.json 建议先使用 npm init -y 初始化正题 // app.js// 1. 引…

03 渲染元素ReactDOM.render

React与ReactDOM是2个不同的库&#xff0c;根节点内的所有内容&#xff08;和DOM更新、渲染相关&#xff09;由ReactDOM来管理一个React应用只有一个根节点用ReactDOM.render将React元素渲染到根节点 ReactDOM.render 参数1 React元素&#xff08;React.createElement(类组件/…

javascript --- 异步按顺序执行

使用promise可以很优雅的封装一个异步函数,使其按指定顺序执行: // 异步读取文件操作 const fs require("fs"); function promiseReadFile(url) {return new Promise(function (resolve, reject) {fs.readFile(url, function(err, data) {if(err) {reject(err);} e…

web提高:负载均衡

1、集群 1、为什么建议在阿里云购买负载均衡 非常便宜&#xff0c;又好用&#xff0c;有稳定&#xff0c;有简单。自己搭建不了负载均衡&#xff0c;因为共有云不支持组播跑不了vrp协议。你不会集群的概念&#xff0c;你还是蒙蒙的。2、为什么使用集群&#xff1f; 1、小规模 …

node --- 一个很好用的包json-server

这个第三方包,可以将json文件暴露出来,用http获取. (data.json如下) 下载依赖: npm install --g json-server查看是否含有json-server json -sever --version启动json-server 参考:https://www.npmjs.com/package/json-server

04 组件与Props

一些概念 组件&#xff1a;视图的片段、内部管理数据集合&#xff08;state&#xff09;外部传入配置结合&#xff08;props&#xff09;包含&#xff1a; 1. 视图标记&#xff08;React的JSX、Vue的template&#xff09;需要经过转换而成为真实的DOM 事件 数据 逻辑&#x…

利用ionic3进行上一行和左一行不动,中间移动的功能

首先在html中的写法是 <ion-header><ion-navbar><ion-title>历史数据</ion-title></ion-navbar></ion-header><ion-content ><div style"display:flex;width:625px;"><div class"head">地区</di…

05 state与setState、单向数据流

声明周期与组件卸载 props配置&#xff1a;使用组件时传入数据state私有数据&#xff1a;组件内部使用的数据 state的使用注意事项 必须使用setState方法来更改state多个setState会合并调用props和state更新数据要谨慎&#xff08;有可能在异步程序中更新&#xff09;setState…

HDU 3342 Legal or Not(拓扑排序)

描述 ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When someone…

jquery --- 阻止表单默认的提交行为,标准化表单的数据

表单如下: // .html <form id"topics_new_form" method"post" action"/topics/new"><div class"form-group"><label for"exampleInputEmail1">选择模块</label><selecet class"form-contr…