Servlet过滤器的使用
Servlet过滤器的使用
制作人:全心全意
Servlet过滤器:Servlet过滤器与Servlet十分相似,但它具有拦截客户端请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。对于程序开发人员而言,过滤器实质上就是在Web应用服务器上的一个Web应用组件,用于拦截客户端与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。
过滤器的核心对象
过滤器对象放置在javax.servlet包中,其名称为Filter,他是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这两个对象也同样是接口对象,位于javax.servlet包中,分别为过滤器的配置对象与过滤器的传递工具。在实际开发中,定义过滤器对象只需要直接或间接地实现Filter接口即可。Filter及相关对象结构图如下图所示。
- Filter接口
每一个过滤器对象都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法,分别为init()方法,doFilter()方法和destroy()方法,其方法声明及说明如下表所示。
方 法 声 明 | 说 明 |
public void init(FilterConfig filterConfig) throws ServletException | 过滤器的初始化方法,该方法在过滤器初始化时调用 |
public void doFilter(ServletReqest request,ServletResponse response,FilterChain chain) throws IOException,ServletException |
对请求进行过滤处理 |
public void destroy() | 销毁方法,释放资源 |
- FilterConfig接口
FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息,其方法声明及说明如下表所示。
方 法 声 明 | 说 明 |
public String getFilterName() | 用于获取过滤器名称 |
public ServletContext getServletContext() | 获取Servlet上下文 |
public String getInitParameter(String name) | 获取过滤器的初始化参数值 |
public Enumeration getInitParameterNames() | 获取过滤器的所有初始化参数 |
- FilterChain接口
FilterChain接口仍然由Servlet容器进行实现,在这个接口中只有一个方法,其方法声明及说明如下表所示。
方 法 声 明 | 说 明 |
public void doFilter(ServletRequest request,ServletResponse,response) throws IOException,ServletException |
该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤链中的最后一个过滤器, 那么,请求将传递给目标资源 |
Servlet过滤器的代码结构
创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter接口的3个方法。其代码结构如下。
package com.zq; 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; public class MyFilter implements Filter { // 初始化方法
public void init(FilterConfig fConfig) throws ServletException {
// 初始化处理
} // 过滤处理方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 过滤处理
chain.doFilter(request, response);
} // 销毁方法
public void destroy() {
// 释放资源
} }
过滤器中的init()方法用于对过滤器的初始化进行处理,destroy()方法是过滤器的销毁方法,主要用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一过滤器或目标资源。
Servlet过滤器的创建示例
实例1:网页访问计数
CountFilter类:过滤器对象,统计访问网站人数功能
package com.zq; 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 NewFilter implements Filter {
private int count; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
count++;// 访问数量自增
// 将ServletRequest转换成HttpServletRequest
HttpServletRequest req = (HttpServletRequest) request;
// 获取ServletContext ServletContext context = req.getSession().getServletContext();
context.setAttribute("count", count); // 将来访数量值放入到ServletContext中
chain.doFilter(request, response);// 向下传递过滤器
} public void init(FilterConfig filterConfig) throws ServletException {
String param = filterConfig.getInitParameter("count");
count = Integer.valueOf(param);
} }
web.xml文件:Servlet过滤器对象声明、映射和设置初始化参数
<filter>
<filter-name>NewFilter</filter-name>
<filter-class>com.zq.NewFilter</filter-class>
<init-param>
<param-name>count</param-name>
<param-value>10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NewFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
index.jsp页面:获取计数器的值
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>人数统计</title>
</head>
<body>
<h2>
欢迎光临,<br> 您是本站的第【
<%=application.getAttribute("count")%>
】位访客!
</h2>
</body>
</html>
实例2:字符编码过滤器(图书信息添加预览)
在Java Web程序开发中,由于Web容器内部所使用的编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据就会出现乱码现象。在实际开发过程中,如果通过每一个业务处理指定字符集编码,则操作过于频繁,而且容易遗漏某一个业务中的字符编码设置;如果通过过滤器来处理字符编码,就可以做到简单又万无一失。
CharactorFilter类:过滤器对象,对请求中的字符编码格式进行设置。
package com.zq; 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; public class CharactorFilter implements Filter {
String encoding = null; public void destroy() {
encoding = null;
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (encoding != null) {// 判断字符编码是否为空
request.setCharacterEncoding(encoding);// 设置request的编码格式
response.setContentType("text/html;charset=" + encoding);// 设置response字符编码
}
chain.doFilter(request, response);
} public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");// 获取初始化参数 } }
CharactorFilter类是实例中的字符编码过滤器,它主要通过在doFilter()方法中,指定request与response两个参数的字符集encoding进行编码处理,使得目标资源的字符集支持中文。其中encoding是CharactorFilter类定义的字符编码格式成员变量,该变量在过滤器的初始化方法init()中被赋值,它的值是通过FilterConfig对象读取配置文件中的初始化参数获取的。
注意:在过滤器对象的doFilter()方法中,业务逻辑处理完成之后,需要通过FilterChain对象的doFilter()方法将请求传递到下一个过滤器或目标资源,否则将出现错误。
AddServlet类:处理添加图书信息请求的Servlet对象。
package com.zq; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
String name = request.getParameter("name");
String author = request.getParameter("author");
String price = request.getParameter("price");
out.println("<h2>图书信息添加成功</h2><hr>");
out.println("图书编码:" + id + "<br>");
out.println("图书名称:" + name + "<br>");
out.println("图书作者:" + author + "<br>");
out.println("图书价格:" + price + "<br>");
out.flush();
out.close();
} }
AddServlet的类主要通过doPost()方法实现添加图书信息请求的处理,其处理方法是将所获取到的图书信息数据直接输出到页面中。
技巧:在Java Web程序开发中,通过情况下,Servlet所处理的请求类型都是GET或POST,所以可以在doGet()方法中调用doPost()方法,把业务处理代码写到doPost方法中,或在doPost()方法中调用doGet()方法,把业务处理代码写到doGet()方法中,无论Servlet接收的请求类型是GET还是POST,Servlet都对其进行处理。
web.xml文件:CharactorFilter类的Servlet过滤器的声明、映射和初始化参数;AddServlet类的Servlet对象的声明和映射
<filter>
<filter-name>CharactorFilter</filter-name>
<filter-class>com.zq.CharactorFilter</filter-class>
<init-param> <!--初始化参数 -->
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharactorFilter</filter-name>
<url-pattern>/*</url-pattern> <!--该项目下所有页面都要经过此过滤器 -->
</filter-mapping>
<servlet>
<servlet-name>AddServlet</servlet-name>
<servlet-class>com.zq.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>
index.jsp页面:程序的主页,放置添加图书信息的表单。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>添加图书信息</title>
</head>
<body>
<form action="AddServlet" method="post">
<table align="center" border="1" width="350">
<tr>
<td class="2" align="center" colspan="2">
<h2>添加图书信息</h2> </td>
</tr>
<tr>
<td align="right">图书编号:</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td align="right">图书名称:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td align="right">图书作者:</td>
<td><input type="text" name="author"></td>
</tr>
<tr>
<td align="right">图书价格:</td>
<td><input type="text" name="price"></td>
</tr>
<tr>
<td class="2" align="center" colspan="2"><input type="submit"
value="提 交"></td>
</tr>
</table>
</form>
</body>
</html>
Servlet过滤器的使用的更多相关文章
- Servlet过滤器
Servlet过滤器 [TOC] 1.过滤器的基本概念 1.1.基本概念 过滤器(Filter)属于tomcat服务器中的Servlet功能.在普通的javaweb服务中,jsp中的请求要被Servl ...
- Servlet过滤器Filter用法
1 Servlet 过滤器方法 过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法:public void ...
- Servlet过滤器和监听器
1,Servlet过滤器 <filter> <filter-name>charset</filter-name> <filter-class>org.g ...
- Servlet 过滤器
一.过滤器介绍 在Servlet 2.3中定义了过滤器,它能够对Servlet容器的请求和响应进行检查和修改. Servlet过滤器能够在Servlet被调用之前检查Request对象,并修改Requ ...
- Servlet基础知识(四)——Servlet过滤器Filter
一.什么是过滤器: 政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入:同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求. 同样的,Servlet中的过滤器既 ...
- Servlet过滤器——过滤器分析流量
1.概述 Servlet过滤器可以对用户提交的数据或服务器返回的数据进行更改.任何到达服务器的请求都会首先经过过滤器的处理.本实例应用过滤器的这个特点,编写了一个在过滤器中统计网站流量的实例. 本实例 ...
- Servlet过滤器——使用过滤器禁止浏览器缓存页面
1.概述 IE缓存虽然能提高已储存网站的访问速度,但是过度的IE缓存会影响浏览器的响应速度.同时还可能为网站的运行带来一些不必要的麻烦.例如:可能会因为浏览器缓存的应用,而导致Web服务器不能准确的计 ...
- Servlet过滤器和监听器知识总结(转)
Servlet过滤器和监听器知识总结(转) Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤.判断用户的登录状态.过滤器使得Servlet开发者能 ...
- servlet(2)servlet过滤器
1.servlet过滤器 用于动态的拦截servlet请求或响应,以变更或使用其中的信息. (1)过滤器和servlet是多对多的关系,即一个过滤器可以用于一个或多个servlet,多个过滤器也可以用 ...
- TODO java-web相关 servlet过滤器+监听器
servlet过滤器 定义: 过滤器是小型的web组件,它负责拦截请求和响应,以便查看.提供或以某种方式操作正在客户机和服务器之间交换的数据. 与过滤器相关的servlet共包含3个简单接口:Filt ...
随机推荐
- POJ1050 To the Max 最大子矩阵
POJ1050 给定一个矩阵,求和最大的子矩阵. 将每一列的值进行累加,枚举起始行和结束行,然后就可以线性优化了 复杂度O(n^3) #include<cstdio> #include&l ...
- Python基础第二天
一.内容 二.练习 练习1 题目:已知msg='hello knight 666'编写for循环,利用索引遍历出每一个字符 图示: 代码: msg = 'hello knight 666' msg_l ...
- Linux day01(二)虚拟机快照和克隆的用法介绍
一:快照 优点:运行虚拟机后不用担心系统会被弄崩溃了,点击快照会立即恢复到初始状态 缺点:回滚会带来数据的丢失,所以要考虑数据恢复的成本和找回数据时进行操作的成本 1. 在导航栏中找虚拟机快照的小图标 ...
- [C陷阱和缺陷] 第5章 库函数
有关库函数的使用,我们能给出的最好建议是尽量使用系统头文件,当然也可以自己造轮子,随个人喜好.本章将探讨某些常用的库函数,以及编程者在使用它们的过程中可能出错之处. 5.1 返回整数的getc ...
- [JOI2014] 小笼包
题面 : https://www.ioi-jp.org/joi/2013/2014-yo/2014-yo-t6/2014-yo-t6.html 题解 dp + 康托展开 一看这题不知道怎么处理 只能枚 ...
- linux C编程 Makefile的使用
Makefile的作用就是"自动化编译" 一.Makefile基本规则 下面给出几个简单实例: 第一步:分别用vim创建prog.c code.c code.h三个文件 prog. ...
- Spark学习之键值对(pair RDD)操作(3)
Spark学习之键值对(pair RDD)操作(3) 1. 我们通常从一个RDD中提取某些字段(如代表事件时间.用户ID或者其他标识符的字段),并使用这些字段为pair RDD操作中的键. 2. 创建 ...
- ADPU 大全
APDU协议 APDU协议,即是智能卡与读写器间的应用层协议,在ISO7816-4[7]中定义了该协议的结构格式.APDU数据有两种结构,读写器使用的APDU结构为命令APDU,C-APDU(Comm ...
- Python学习日记之忽略删除字符串空白
使用Python自带的函数strip可以剔除字符串开头.结尾.两端的空白 使用场景:用户输入验证 strip : 去除字符串两端的空白 rstrip : 去除字符串末尾(右端)的空白 lstrip : ...
- python自动化--模块操作之re、MySQL、Excel
一.python自有模块正则 import re # re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None print(re.match("www ...