Java web—Servlet过滤器(Filter)
前言:
过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器;因此这篇blog来单独总结下关于过滤器的知识点。
一、首先来了解一下什么是过滤器:
下面这句话引自这篇文章
Filte即过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下:
二、Filter特点:
- Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象。
- Servlet过滤器可以被指定和特定的URL关联,且不能独立执行,只有当客户请求访问该URL时,才会触发过滤器。
- Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象(过滤器链)。
三、过滤器的实现:
建立一个过滤器涉及下列五个步骤:
- 建立一个实现Filter接口的类;
- 在doFilter方法中实现过滤行为;
- 调用FilterChain对象的doFilter方法;
- 对相应的servlet和JSP页面注册过滤器;
- 禁用激活器servlet;
1、建立一个实现Filter接口的类:
- Servlet过滤器类必须实现javax.servlet.Filter
- 这个接口含有3个过滤器类必须实现的方法:
init( )doFilter( )destroy( )
public void init(FilterConfig config) thows ServletException
只在此过滤器第一次初始化时执行- 简单过滤器可提供此方法的空体,两种情况使用init:
- FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。利用init将FilterConfig对象存放在一个字段中,以便doFilter方法能够访问servlet环境或过滤器名。
- FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。
2、在doFilter方法中实现过滤行为:
- 重要方法:
public void doFilter(ServletRequset request, ServletResponse response,FilterChain chain)
3、调用FilterChain对象的doFilter方法:
- 最后一个参数FilterChain对象。对此对象调用以激活与servlet或JSP相关的下一个过滤器。如果没有另一个相关的过滤器,则对doFilter的调用激活servlet或JSP本身
4、对相应的servlet和JSP页面注册过滤器:
- web.xml中用于过滤器的元素:
filter
:元素向系统注册一个过滤对象
filter-mapping
:元素指定该过滤对象所应用的URL
<filter-name>
必需元素,必须与用filter元素声明时给予过滤器的名称相匹配
<url-pattern>
必需元素,此元素声明一个以斜杠"/"
开始的模式,它指定过滤器应用的URL。
例:
要求:利用filter和filter-mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet。
web.xml应配置为:
<filter><filter-name>SomeFilter</filter-name><filter-class>sPackage.SFilterClass</filter-class>
</filter>
<filter-mapping> <filter-name>SomeFilter</filter-name><servlet-name>SomeServlet</servlet-name>
</filter-mapping>
5、禁用激活器servlet:
- 在对资源应用过滤器时,可通过指定要应用过滤器的URL模式或servlet名来完成。
- 如果提供servlet名,则此名称必须与web.xml的servlet元素中给出的名称相匹配。
- 如果使用应用到一个serlvet的URL模式,则此模式必须与利用web.xml的元素servlet-mapping指定的模式相匹配。
- 防止用户利用缺省servlet URL绕过过滤器设置 。
四、对请求信息的过滤:
对请求信息的过滤大致分为下列5个步骤:
- Servlet容器创建一个过滤器实例。
- 过滤器实例调用init方法,读取过滤器初始化参数。
- 过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法。
- 如果该请求不合法则阻塞该请求。
- 如果该请求合法则调用chain.doFilter方法将该请求向后续传递。
因为Servlet对中文支持不好,用户提交的表单信息会产生乱码问题,会给后台的数据查询和记录(数据库存储)等功能造成影响,因此需要对请求信息进行转码。
解决方法一:
直接在Servlet中转码
处理get请求::
String name = request.getParameter(param_name);name = new String( name.getBytes("ISO8859_1") );
处理post请求:
request.setCharacterEncoding("utf-8");
直接在servlet里处理的缺点是从request中取出的每个中文变量都要转换,且不能动态的改变编码。
解决方法二:
在过滤器中进行转码,且在一个动态web项目里设置完成后就可以不用在单个Servlet中一一设置了。
例:
Filter类:
public class MyFilter implements Filter
{ private String tarEncoding = "gb2312";protected FilterConfig filterConfig;public void init(FilterConfig config) throws ServletException { this.filterConfig = config; this.tarEncoding = config.getInitParameter("encoding"); } public void doFilter( ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)srequest;HttpServletResponse response = (HttpServletResponse)sresponse;//把请求用指定的方式编码 request.setCharacterEncoding(targetEncoding);//把响应用指定的方式编码response.setCharacterEncoding(targetEncoding);// 把处理发送到下一个过滤器 chain.doFilter(srequest,sresponse); } public void destroy() { this.filterConfig=null; }
}
过滤器部署描述:
<filter><filter-name>encod</filter-name><filter-class>pdsu.edu.cn.chu.MyFilter</filter-class><init-param><param-name>encoding</param-name><param-value>gb2312</param-value></init-param></filter>
<filter-mapping><filter-name>encod</filter-name><url-pattern>/*</url-pattern>
<filter-mapping>
过滤器只能解决Post提交的中文乱码问题,Get提交中文乱码解决方法为:
修改tomcat配置文件下的server.xml,找到对8080端口进行服务的Connector组件的设置部分,为Connector添加属性URIEncoding="GBK"
五、对响应信息的过滤:
- 过滤器截获客户端的请求.
- 重新封装ServletResponse,在封装后的ServletResponse中提供用户自定义的输出流;即:
- 将请求向后续传递。
- Web组件产生响应。
- 从封装后的ServletResponse中获取用户自定义的输出流。
- 将响应内容通过用户自定义的输出流写入到缓冲流。
- 在缓冲流中修改响应的内容后清空缓冲流,输出响应内容。
Java web—Servlet过滤器(Filter)相关推荐
- Java Web之过滤器Filter(@WebFilter)
过滤器(Filter) 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 ...
- JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持
JAVA Web Servlet中的异步处理 (1) – Servlet3.0中的Async支持 每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会 ...
- JAVA WEB篇4——Filter、Listener
JAVA WEB篇4--Filter.Listener 1.Filter Filter本意为"过滤"的含义,是JavaWeb的三大组件之一,三大组件为:Servlet.Filter ...
- java web开发中Filter使用Annotation配置 (转载)
为什么80%的码农都做不了架构师?>>> 为了在java中得到request和response对象,搜索到了 <如何在Java的普通类中获取Session以及reques ...
- JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持
JAVA Web Servlet中的异步处理 (2) – Servlet3.1中的Non-blocking IO支持 在servlet 3.1中,新增了non-blocking IO支持. 在serv ...
- Java Web Servlet
Java Web Servlet Servlet是在服务器上运行的小程序.一个Servlet就是一个Java类,并且可以通过"请求-响应"编程模型来访问的这个驻留在服务器内存里的S ...
- java request获取域,Java Web - Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(二)...
Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据.请求分派.请求域)(2) HttpServletRequest ----------------- ...
- 基于java web servlet生鲜商城管理系统源码含报告文档
(一)目的 电子商务的迅速兴起,网上购物也为人们的生活提供了极大的便利,不受时间和空间的限制.商城系统的兴起,扩大了消费市场的空间,对于大型企业来说,建设商城系统是正确的选择,不仅要扩大销售渠道,而且 ...
- 【暑假学习笔记】之——用Intellij idea新建一个java web+Servlet项目(有实例)——idea中快速重写父类的方法
Intellij idea中快速重写父类方法 在写java文件时,有时候需要重写父类方法,但在idea中创建java文件时并不会像eclipse一样可以选择父类,但是重写父类方法其实只需要这样做: 鼠 ...
最新文章
- 用python打造一款文件搜索工具,所有功能自己定义!
- node.js浅入深出---fs模块的stat判断是否为文件夹
- SQLite中的SELECT子句使用表达式
- 为什么6lowpan 要有四个地址_大型监控网络系统如何规划ip地址
- 计算机网络模拟校园,计算机网络课程设计模拟校园网组网实验.doc
- Scrapy爬虫报错AttributeError: ‘NoneType‘ object has no attribute ‘write‘
- 剑指offer之链表中环的入口结点
- 利用PCL做点云的平面拟合
- 机器学习基础:K近邻算法(Machine Learning Fundamentals: KNN)
- 快速搭建自己的人脸识别系统
- python时间格式毫秒_Python获取秒级时间戳与毫秒级时间戳
- 计算机基础文献检索考核,文献检索实验
- Markdown生成左侧目录
- 2021-08-02彻底解决Typora+PicGo-Core+SMMS图床的问题
- CSS二(复合选择器)
- 《用户至上:用户研究方法与实践(原书第2版)》一2.1 概述
- 绕过CDN获取服务器真实IP地址
- linux grub2 分辨率,如何安全地更改grub2屏幕分辨率?
- 计算机单片机考试作弊检讨书,关于大学生考试作弊检讨书1000字范文[共7页]
- JBuilder连接oracle数据库
热门文章
- 连连看java代码_连连看 - java代码库 - 云代码
- 线性Transformer应该不是你要等的那个模型
- GELU的两个初等函数近似是怎么来的?
- 近期有哪些值得读的QA论文?| 专题论文解读
- 复旦大学肖仰华教授:知识图谱与认知智能 | 附PPT下载
- CVPR 2019 论文和开源项目合集(Papers with Code)
- Leecode之翻转整数
- linux操作这样用视频,Linux下使用mencoder对视频进行操作
- python pip gpl_一文了解Python的pip工具
- 【Greenplum异常】数据库报错 could not create temporary file No space left on device(求解决)