Filter

过滤器 Filter

filter是对客户端访问资源的过滤,访问某个资源时,符合条件就通过,否则就不通过,并且可以对目标资源访问前后进行逻辑处理。

服务器创建时就创建了该filter对象,服务器关闭时 filter就销毁。

Filter接口有三个方法,并且这三个方法都是与filter生命相关的方法。

init(Filterconfig) --代表filter对象初始化方法 filter对象创建时执行

doFilter(ServletRequest,ServletResponse.FilterCha); --代表filter对象执行的核心方法,如果某个资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法

destory() --代表是filter销毁方法,当filter对象销毁时执行该方法

创建testFilter类 实现Servlet包下的 Filter接口 重写三个方法

package com.david.filter;


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

public class testFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter被初始化了");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤方法");
        
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("filter被销毁了");
    }
}

配置xml文件 url-pattern 进行过滤的资源

    <filter>
        <filter-name>testFilter</filter-name>
        <filter-class>com.david.filter.testFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>testFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

filter配置

完全匹配 <url-pattern>中 /test 只有访问test路径才会匹配成功

目录匹配 /users/*  只有访问users目录才会匹配成功

后缀名匹配 *.jsp 只有访问jsp文件才会匹配成功 后缀名匹配 只能以*号开头 不能前面加目录 /users/*.jsp 这是错误的

除了配置url-pattern路径外 还可以配置servlet-name

dispatcher 访问方式

    <filter>
        <filter-name>testFilter</filter-name>
        <filter-class>com.david.filter.testFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>testFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

REQUEST 默认值,代表直接访问某个资源时执行

FORWARD 转发时执行 request.getRequestDispatcher("/test1").forward(req,res);

INCLUDE 包含资源时执行 

ERROR 发生错误时执行

例如使用filter对登陆权限进行认证 地址配置为/admin/* admin文件夹下所有的文件 然后再filter中判断cookie 或session身份认证

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤方法");

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;

        Cookie[] cookies =  req.getCookies();
        String CurrentUserName = null;
        if(cookies != null){
            for(Cookie c : cookies){
                if("myUser_name".equals(c.getName())){
                    CurrentUserName = c.getName();
                }
            }
        }

        if(CurrentUserName != null){
            //已登陆 放行访问内容
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //未登录
            res.sendRedirect("/login");
        }


    }

解决全局乱码问题,就不用每个都设置一下 编码类型了

        req.setCharacterEncoding("UTF-8");
        res.setCharacterEncoding("UTF-8");
原文地址:https://www.cnblogs.com/baidawei/p/9036783.html