Filter过滤器
实现步骤:
-
-
- 在web.xml文件中注册过滤器,并配置初始化参数
- 定义类实现Filter接口
- 实现doFilter方法
- 定义类继承HttpServletRequestWrapper
- 重写getParameter与getParameterValues两个方法
-
//web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.epoint.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
//FilterTest
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 FilterTest implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("begin init of FilterTest .......");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("begin doFilter of FilterTest .......");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("begin destroy of FilterTest .......");
}
}
项目运行就调用init方法 访问 客户端发生请求 就调用doFilter方法
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.epoint.filter.FilterTest</filter-class>
<!-- 配置filter信息 初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>type</param-name>
<param-value>THML</param-value>
</init-param>
</filter>
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("begin init of FilterTest .......");
//获取filter的初始化参数
String initParameter = filterConfig.getInitParameter("encoding");
System.out.println(initParameter);
System.out.println("--------------");
//获取当前filter所有初始化参数的名称,返回一个枚举类
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
//获取初始化参数名称
String initParam = initParameterNames.nextElement();
//获取参数的值
String initParamValue = filterConfig.getInitParameter(initParam);
System.out.println(initParam + " : "+ initParamValue);
System.out.println("--------------");
// 获取当前Filter的上下文对象ServletContext
ServletContext servletContext = filterConfig.getServletContext();
System.out.println(servletContext.getContextPath());
}
}
运行结果
package com.epoint.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;
@WebFilter("/*")
public class FilterA implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("begin doFilter of FilterA .......");
chain.doFilter(request, response);
System.out.println("end doFilter of FilterA .......");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
运行结果:
如果filter是通过注解配置的形式 filter是顺序是按按照当前filter的名字来排列的
//放行到其它filter
chain.doFilter(request, response);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 统一应用字符编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
}
登录页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="LoginServlet" method="post">
姓名:<input type="text" id="username" name="username" />
<br>
密码:<input type="password" id="password" name="password" />
<br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
LoginServlet.java
package com.epoint.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
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());
//获取session
HttpSession session = request.getSession();
//把前台传过来的username保存到session
session.setAttribute("username", request.getParameter("username"));
System.out.println("=====");
//请求转发
request.getRequestDispatcher("/success.html").forward(request, response);;
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
LoginFilter.java
package com.epoint.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet Filter implementation class LoginFilter
*/
@WebFilter("/success.html")
public class LoginFilter implements Filter {
/**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
HttpSession session =httpServletRequest.getSession();
if (session.getAttribute("username") != null) {
//拿到了用户的登录信息
chain.doFilter(request, response);
} else {
//没有用户信息,跳转到登录页面
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.html");
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
创建一个VisitCountFilter,用于统计当前网站的访问量,访问时,能够在浏览器页面显示您是第XX位访客。
package com.epoint.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.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
/**
* Servlet Filter implementation class VisitCountFilter
*/
@WebFilter("/index.html")
public class VisitCountFilter implements Filter {
//声明来访数量
private int count;
/**
* Default constructor.
*/
public VisitCountFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
//访问数量自增
count++;
//将ServletRequest转换为HttpServletRequest
HttpServletRequest req =(HttpServletRequest)request;
//获取ServletContext相当于application
ServletContext context = req.getSession().getServletContext();
//2)获取计数对象。
Integer count=(Integer)context.getAttribute("count");
//3) 将计数结果存储到域对象中,并显示到页面上。
context.setAttribute("count", ++count);
response.getWriter().write("第"+count+"位访问者");
//向下传递过滤器
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
fConfig.getServletContext().setAttribute("count", 0);
}
}