Servlet过滤器主要用于对客户端(浏览器)的请求进出过滤处理,然后将过滤后的请求转交给下一资源。
Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。过滤器实质上就是在Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。
如果在Web窗口中部署了过滤器链,也就是部署了多个过滤器,请求会一次按照过滤器顺序进行处理。
过滤器对象名称为Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,分别为过滤器的配置对象与过滤器的传递工具。
Filter接口定义了init()方法、doFilter()方法、destroy()方法。每一个过滤器对象都要直接或间接地实现Filter接口。
FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息。
FilterChain接口也是由Servlet容器实现,它只有一个doFilter()方法,用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么该请求将传送给目标资源。
----------------------------------------------------------------------------------------------------------------------------------------------------------
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;
/**
* 统计过滤器
* @author Li YongQiang
*/
public class CountFilter implements Filter {
// 来访数量
private int count;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数
String param = filterConfig.getInitParameter("count");
// 将字符串转换为int
count = Integer.valueOf(param);
}
@Override
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();
// 将来访数量值放入到ServletContext中
context.setAttribute("count", count);
// 向下传递过滤器
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>10.3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 过滤器声明 -->
<filter>
<!-- 过滤器的名称 -->
<filter-name>CountFilter</filter-name>
<!-- 过滤器的完整类名 -->
<filter-class>com.lyq.CountFilter</filter-class>
<!-- 设置初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>count</param-name>
<!-- 参数值 -->
<param-value>5000</param-value>
</init-param>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>CountFilter</filter-name>
<!-- 过滤器URL映射 -->
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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>
上述代码创建了一个名为CountFilter的过滤器对象,然后在Web.xml中配置该过滤器对象,最后创建JSP页面,在该页面中通过JSP内置对象Application获取值。
该代码实现了一个网站访问计数器的的功能,用于记录网址访问人数。
----------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------
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;
@Override
public void destroy() {
encoding = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 判断字符编码是否为空
if(encoding != null){
// 设置request的编码格式
request.setCharacterEncoding(encoding);
// 设置response字符编码
response.setContentType("text/html; charset="+encoding);
}
// 传递给下一过滤器
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数
encoding = filterConfig.getInitParameter("encoding");
}
}
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 添加图书信息的Servlet
*/
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 处理GET请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
// 处理POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 PrintWriter
PrintWriter out = response.getWriter();
// 获取图书编号
String id = request.getParameter("id");
// 获取名称
String name = request.getParameter("name");
// 获取作者
// 获取价格
String price = request.getParameter("price");
// 输出图书信息
out.print("<h2>图书信息添加成功</h2><hr>");
out.print("图书编号:" + id + "<br>");
out.print("图书名称:" + name + "<br>");
out.print("作者:" + author + "<br>");
out.print("价格:" + price + "<br>");
// 刷新流
out.flush();
// 关闭流
out.close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>10.3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 声明过滤器 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>CharactorFilter</filter-name>
<!-- 过滤器的完整类名 -->
<filter-class>com.lyq.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映射 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 声明Servlet -->
<servlet>
<!-- Servlet名称 -->
<servlet-name>AddServlet</servlet-name>
<!-- Servlet完整类名 -->
<servlet-class>com.lyq.AddServlet</servlet-class>
</servlet>
<!-- Servlet映射 -->
<servlet-mapping>
<!-- Servlet名称 -->
<servlet-name>AddServlet</servlet-name>
<!-- URL映射 -->
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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对象,然后创建了一个JSP页面输入信息。
字符编码过滤器对象在doFilter()方法中对请求中的字符编码格式进行设置,Servlet对象用来处理添加图书信息的请求,实现请求的方法为doPost()方法,最后在创建一个JSP页面用于放置添加图书信息的表单。
----------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------
import java.util.*;private static UserInfoList user = new UserInfoList();
private Vector vector = null;
/*
利用private调用构造函数,
防止被外界产生新的instance对象
*/
public UserInfoList() {
this.vector = new Vector();
}
/*外界使用的instance对象*/
public static UserInfoList getInstance() {
return user;
}
/*增加用户*/
public boolean addUserInfo(String user) {
if (user != null) {
this.vector.add(user);
return true;
} else {
return false;
}
}
/*获取用户列表*/
public Vector getList() {
return vector;
}
/*移除用户*/
public void removeUserInfo(String user) {
if (user != null) {
vector.removeElement(user);
}
}
}
public class UserInfoTrace implements javax.servlet.http.HttpSessionBindingListener {
private String user;
private UserInfoList container = UserInfoList.getInstance();
public UserInfoTrace() {
user = "";
}
public void setUser(String user) {
this.user = user;
}
public String getUser() {
return this.user;
}
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("上线" + this.user);
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("下线" + this.user);
if (user != "") {
container.removeUserInfo(user);
}
}
}
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;
@Override
public void destroy() {
encoding = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 判断字符编码是否为空
if(encoding != null){
// 设置request的编码格式
request.setCharacterEncoding(encoding);
// 设置response字符编码
response.setContentType("text/html; charset="+encoding);
}
// 传递给下一过滤器
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数
encoding = filterConfig.getInitParameter("encoding");
}
}
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.util.*"%>
<%@ page import="com.listener.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用监听查看在线用户</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<%
UserInfoList list=UserInfoList.getInstance();
UserInfoTrace ut=new UserInfoTrace();
String name=request.getParameter("user");
ut.setUser(name);
session.setAttribute("list",ut);
list.addUserInfo(ut.getUser());
session.setMaxInactiveInterval(10);
%>
<body>
<div align="center">
<table width="506" height="246" border="0" cellpadding="0" cellspacing="0" background="image/background2.jpg">
<tr>
<td align="center"><br>
<textarea rows="8" cols="20">
<%
Vector vector=list.getList();
if(vector!=null&&vector.size()>0){
for(int i=0;i<vector.size();i++){
out.println(vector.elementAt(i));
}
}
%>
</textarea><br><br>
<a href="loginOut.jsp">返回</a>
</td>
</tr>
</table>
</div>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<%
session.invalidate();
out.println("<script>parent.location.href='index.jsp';</script>");
%>
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用监听查看在线用户</title>
</head>
<script language="javascript">
function checkEmpty(form){
for(i=0;i<form.length;i++){
if(form.elements[i].value==""){
alert("表单信息不能为空");
return false;
}
}
}
</script>
<link href="css/style.css" rel="stylesheet" type="text/css">
<body>
<div align="center">
<table width="506" height="170" border="0" cellpadding="0" cellspacing="0" background="image/background1.jpg">
<tr>
<td align="center">
<form name="form" method="post" action="showUser.jsp" onSubmit="return checkEmpty(form)">
<input type="text" name="user"><br><br>
<input type="submit" name="Submit" value="登录">
</form>
</td>
</tr>
</table>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>web</display-name>
<!-- 声明过滤器 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>CharactorFilter</filter-name>
<!-- 过滤器的完整类名 -->
<filter-class>com.listener.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映射 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<description>Added by JBuilder to compile JSPs with debug info</description>
<servlet-name>debugjsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>classdebuginfo</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>debugjsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.listener.MyContentListener</listener-class>
</listener>
</web-app>
通过监听器功能统计在线人数!!!
过滤器可以应用于分级管理,分成一级管理员,二级管理员,三级管理员等,实现管理层的优化,也可以用于区分用户和管理员。
监听器应用于监听事件及请求,主要应用于监听网站,应用或聊天室的在线人数。