zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/baidawei/p/9036783.html
Copyright © 2011-2022 走看看