过滤器的使用

时间:2019-04-20
本文章向大家介绍过滤器的使用,主要包括过滤器的使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一.什么是过滤器? 

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