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");
  • 相关阅读:
    kafka 支持发布订阅
    linux 安装 ORACLE JDK 8
    SPRING 集成 KAFKA 发送消息
    安装kafka 集群 步骤
    zookeeper 单机集成部署
    CAS 界面根据不同的域名显示不同的界面
    POSTMAN 数据关联
    Google Code Jam 2014 Round 1B Problem B
    hdu3555
    hdu2089
  • 原文地址:https://www.cnblogs.com/baidawei/p/9036783.html
Copyright © 2011-2022 走看看