• 过滤器Filter


    过滤器Filter

    • 用于拦截请求、过滤响应
    • 在不使用过滤器时,浏览器向服务器发送请求后,服务器将会直接去获取资源并响应给浏览器
    • 添加Filter后,浏览器向服务器发送请求,请求在到达服务器之间会先经过Filter,在Filter进行一系列判断后满足条件才可以被允许通过过滤到达服务器. 而服务器的响应在抵达浏览器之前同样会先经过Filter之后才会到浏览器

    Filter使用:

    • 导包:javax.servlet.Filter
    • Filter是一个接口,符合JavaEE规范。
    • Filter接口的实现类被称作是一个过滤器,实现类需要重写Filter中的抽象方法
    • Filter中有三个方法如下:
    // init--> 初始化方法
    default public void init(FilterConfig filterConfig) throws ServletException {}
    // doFilter--> 过滤器实体方法
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException;
    // destroy --> 销毁过滤器的方法
    default public void destroy() {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    init:在Web工程启动时就会调用进行初始化

    doFilter:三个参数: request请求和response响应 chain链
    FilterChain:过滤器链,当前过滤器过滤通过后会将请求或响应交给下一个过滤器执行,可以理解为当前过滤器允许该请求或响应通过

    // 过滤器放行的固定写法
    chain.doFilter(request, response);
    
    • 1
    • 2

    destory:销毁该过滤器

    配置Filter:

    // 注解
    @WebFilter(urlPatterns = {"/doFilter"})
    // Web.xml配置  与配置Servlet方法相同
    <filter>
    	<filter-name>filterTest</filter-name>
    	<filter-class>com.filter.TestFilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>filterTest</filter-name>
    	<url-pattern>/*
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用实例:

    向web界面输出文字,通过过滤器进行编码,不通过过滤器将会打印乱码

    // 过滤器
    @WebFilter(urlPatterns = {"/doFilter"})
    public class Filter01 implements Filter {
        // 初始化方法
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Filter初始化完成");
        }
        // 过滤器主体
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset:utf-8");
            // 允许通过过滤器
            chain.doFilter(request, response);
        }
        // 销毁方法
        public void destroy() {
            System.out.println("Filter被销毁");
        }
    }
    // Servlet
    @WebServlet(urlPatterns = {"/doFilter","/doNotFilter"})
    public class Demo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("

    你好,郑州

    "
    ); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    上述代码所示:当通过映射路径/doNotFilter将会打印出中文乱码,反之通过/doFilter则会设置好响应的中文编码正常输出

  • 相关阅读:
    北京十大律师事务所排名前十名(8月最新发布)
    关于解决 unable to start ssh-agent service, error :1058
    游戏成元宇宙“主力军”:上半年收入占比达94%
    linux通过top和iostat查找io性能瓶颈
    *算法训练(leetcode)第二十五天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列
    【加密算法】PKI技术
    CPU GPU TPU NPU 的一些概念 和 使用
    GIT常用操作记录
    Java -- 每日一问:谈谈你的GC调优思路?
    推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。
  • 原文地址:https://blog.csdn.net/yuqu1028/article/details/128121201