1. 什么是过滤器
Servlet过滤器实质上就是在web应用服务器上的一个web应用组件,用于拦截客户端(浏览器) 与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。
每一个过滤器对象都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法,分别为init()方法、doFilter()方法和destroy()方法。
过滤器中的init()方法用于对过滤器的初始化进行处理;
destroy()方法是过滤器的销毁方法,主要用于释放资源;
对于过滤处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一过滤器或目标资源。
2. Filter过滤器实现统计访问量和统一编码格式
2.1 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
欢迎光临,<br>
您是本站的第[
<%= application.getAttribute("count") %>
]位访客!
</h2>
<form action="TestServlet" method="post">
<input type="text" name="age">
<input type="submit">
</form>
</body>
</html>
2.2 CountFilter.java
package com.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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* Servlet Filter implementation class CountFilter
*/
//@WebFilter("/CountFilter")
public class CountFilter implements Filter {
//声明来访数量
private int count;
/**
* Default constructor.
*/
public CountFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//获取初始化参数
String param =fConfig.getInitParameter("count");
//将字符串转换为int
count=Integer.valueOf(param);
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//访问数量自增
count++;
//将ServletRequest转换为HttpServletRequest
HttpServletRequest req =(HttpServletRequest)request;
//获取ServletContext相当于application
ServletContext context = req.getSession().getServletContext();
//将来访数量值放入到ServletContext中
context.setAttribute("count", count);
//向下传递过滤器
chain.doFilter(request, response);
}
}
2.3 CharactorFilter.java
package com.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.annotation.WebFilter;
/**
* Servlet Filter implementation class CharactorFilter
*/
//@WebFilter("/CharactorFilter")
public class CharactorFilter implements Filter {
//字符编码
String encoding=null;
/**
* Default constructor.
*/
public CharactorFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
encoding=null;
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//判断字符编码是否为空
if(encoding!=null) {
//设置request的编码格式
request.setCharacterEncoding(encoding);
//设置response的编码格式
response.setContentType("text/html;charset="+encoding);
}
//传给下一过滤器
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//获取初始化参数
encoding=fConfig.getInitParameter("encoding");
}
}
2.4 TestServlet.java
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestServlet
*/
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String age= request.getParameter("age");
PrintWriter out =response.getWriter();
out.println(age);
}
}
2.5 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>filter123</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.filter.CountFilter</filter-class>
<init-param>
<param-name>count</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CountFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>CharactorFilter</filter-name>
<filter-class>com.filter.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>
</web-app>