11、Filter(过滤器 重点)

文章目录

11、Filter(过滤器 重点)

springMVC、springBoot、安全框架(Shiro,做安全认证的)里边的一些东西都是用过滤器实现的

Filter:过滤器,用来过滤网站的数据

  • 处理中文乱码
  • 登录验证……

11、Filter(过滤器 重点)

Filter开发步骤:

1.导包

在pom.xml下

<dependencies>
  <!--Servlet 依赖-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
  </dependency>
  <!--JSP 依赖-->
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
  </dependency>
  <!--JSTL表达式的依赖-->
  <dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
  </dependency>
  <!-- standard 标签库-->
  <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
  </dependency>

  <!-- 连接数据库还需要导入两个包-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.24</version>
  </dependency>
</dependencies>

2.编写过滤器

1.导包不要错

11、Filter(过滤器 重点)

2.实现Filter接口

重写对应的方法即可

方法

  • init(FilterConfig filterConfig) ,初始化 :
    • web服务器启动,就已经初始化了,随时等待过滤器对象出现!
    • 他和服务器一同启动的
  • doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain),
    • FilterChain Chain :链
  • destroy()
    • 销毁 web服务器关闭的时候,过滤器会销毁
package com.kuang.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * 字符集编码过滤器
 * @author <1455272942@qq.com>
 * @since 2021/6/21 18:33
 *
 * 过滤器 总结
 * 1.过滤器中的所有代码,在过滤特点请求的时候都会执行
 * 2.必须要让过滤器 继续同行 :把这个请求往下转交  转交的代码
 *   filterChain.doFilter(servletRequest,servletResponse);  固定的死代码
 *
 */
public class CharacterEncodingFilter implements Filter {

    @Override
//    初始化 :web服务器启动,就已经初始化了,随时等待过滤器对象出现!  他和服务器一同启动的
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
//    FilterChain  Chain :链
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 过来的请求等于utf-8编码
        servletRequest.setCharacterEncoding("utf-8");
        // 过去的请求等于utf-8编码
        servletResponse.setCharacterEncoding("utf-8");
        // 上下文
        servletResponse.setContentType("text/html;charset=UTF-8");

        System.out.println("CharacterEncodingFilter执行前");
//        让我们的请求继续走,如果不写,程序到这里就拦截停止了    如:两个过滤器
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter执行前后");
    }

    @Override
//    销毁  web服务器关闭的时候,过滤器会销毁
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
    }
}

3.在web.xml中配置 servlet 和 filter
<servlet>
  <servlet-name>ShowServlet</servlet-name>
  <servlet-class>com.kuang.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>ShowServlet</servlet-name>
  <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>ShowServlet</servlet-name>
  <url-pattern>/show</url-pattern>
</servlet-mapping>


<!--配filter-->
<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <!--只要是 / servlet下的任何请求,都会经过这个过滤器-->
  <url-pattern>/servlet/*</url-pattern>
</filter-mapping>
4.展示Servlet
package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 展示Servlet
 * @author <1455272942@qq.com>
 * @since 2021/6/21 18:35
 */
public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //以前的处理方式
//        resp.setCharacterEncoding("utf-8");
        // 乱码
        resp.getWriter().write("你好,世界");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

结论:

当路径是 localhost:8080/servlet/show的时候 显示 你好,世界 过滤器启动了

当路径是localhost:8080/show的时候,显示 ??? 乱码 过滤器未启动

过滤器 总结

    1. 过滤器中的所有代码,在过滤特点请求的时候都会执行
    1. 必须要让过滤器 继续同行 :把这个请求往下转交 转交的代码
  • filterChain.doFilter(servletRequest,servletResponse); // 固定的死代码

上一篇:简单实现 http Server (版本1、2)


下一篇:dplyr五个核心函数:filter()筛选行 arrange()排列行 select()选择列 mutate()基于现有变量创建新变量列 summarise()计算摘要统计量