一.什么是过滤器?
Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特俗功能,例如,纪录所有客户端的每次访问信息,同级静态HTML页面的访问次数,验证访问者的身份,修改Servlet容器传递给Servlet的请求信息,修改Servlet回送给Servlet容器的响应结果。
Filter的基本工作原理
Filter程序是一个实现了特殊接口(javax.servlet.Filter)的Java类,与Servlet程序相似,由Servlet容器进行调用和执行。
Filter程序需要在web.xml文件中进行注册和设置它所能拦截的资源,当Servlet容器开始调用某个Servlet程序时,如果发现已经注册了一个Filter程序来对该Servlet进行拦截,那么Servlet容器将不再直接调用Servlet的service方法,而是调用Filter的doFilter方法,再由doFilter方法决定是否去激活Servlet的service方法。在doFilter中调用FilterChain.doFilter方法来激活目标Servlet的service方法。如果没有调用,那么目标Servlet的service的方法就不会执行,在FilterChain.doFilter调用的前后增加一些处理代码,就可以实现Servlet响应前后的一些特殊处理。
Filter链
一个web程序中可以注册多个Filter程序,每个Filter程序可以对一个或一组Servlet程序进行拦截,如果有多个Filter程序对某个Servlet的程序的访问过程进行拦截,当针对该Servlet的访问请求到达时,这些拦截的FIlter程序就组成了一个Filter链,也称过滤器链。这个链的拦截顺序与他们在web.xml文件中的映射顺序一致,上一个Filter中的doFilter方法调用的FilterChain.doFilter将激活下一个Filter的doFilter方法,最后一个Filter激活目标Servlet的service方法。
/* 解决中文乱码开始 */
一.登录html
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2019/4/20 0020 Time: 9:21 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> </head> <body> <form action="/login" method="post" > <input type="text" name="username" placeholder="请输入用户名"><br> <input type="password" name="password" placeholder="请输入密码"><br> <input type="submit" value="提交"><br> </form> </body> </html>
二. 配置过滤器
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Filter implements javax.servlet.Filter { public void destroy() { } public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { //转换 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;character=UTF-8"); /* * 使用doFilter方法调用链中的下一个过滤器或目标资源(servlet或JSP页面)。 * chain.doFilter处理过滤器的其余部分(如果有的话),最终处理请求的servlet或JSP页面。 */ chain.doFilter(request, response); } public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException { } }
三.web.xml配置filter
四.运行查看效果
未过滤的情况:
过滤器生效之后:
/* 解决中文乱码结束 */
注意:
细心的同学一定发现html中action的post标记为了红色,为什么? 因为如果你用的GET请求的话,
request.setCharacterEncoding("utf-8"); 测试过后并不会生效。具体用法是:
String string = request.getParamers("");
String = new String(string.getBytes("ISO8859-1","utf-8"));
源码下载: https://pinecloud.cn/download/Filter.zip