Filter

Posted 超霸霸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter相关的知识,希望对你有一定的参考价值。

Filter

一、概念

  • web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
  • 过滤器的作用:一般用于完成通用的操作:登录验证、统一编码处理、敏感字符过滤…

二、快速入门

  • 步骤:

    1. 定义一个类,实现Filter
    2. 复写方法
    3. 配置拦截路径
      • web.xml
      • 注解
    package cn.chao.web.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class filterDemo1 implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            Filter.super.init(filterConfig);
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("filterDemo1被执行了....");
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
    
        }
    
        @Override
        public void destroy() {
            Filter.super.destroy();
        }
    }
    
  • web.xml配置

    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>cn.chao.web.filter.filterDemo1</filter-class>
    </filter>    
    <filter-mapping>
            <filter-name>demo1</filter-name>
            <!-- 拦截路径 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • 过滤器执行流程

    1. 执行过滤器
    2. 执行放回后的资源
    3. 回来执行过滤器放行代码下面的代码
  • 过滤器生命周期方法

    1. init:在服务器启动后会创建Filter方法,然后调用init方法。只执行一次,用于加载资源
    2. doFilter:每一次请求被拦截资源时,会执行,执行多次
    3. destroy:在服务器关闭后,Filter对象被摧毁。如果服务器正常关闭则会执行destroy方法,只执行一次,用于释放资源
  • 过滤器配置详解

    1. 拦截路径配置
      • 具体资源路径:/index.jsp,只有访问index.jsp资源时过滤器才被执行
      • 拦截目录:/user/*,访问/user下的所有资源时,过滤器都会被执行
      • 后缀名拦截:*.jsp,访问所有后缀名为jsp的资源时,过滤器都会被执行
      • 拦截所有资源:/*,访问所有资源时,过滤器都会被执行
    2. 拦截方式配置
      • 注解配置:设置dispatcherTypes属性
        1. REQUEST:默认值,浏览器直接请求资源
        2. FORWARD:转发访问资源
        3. INCLUDE:包含访问资源
        4. ERROR:错误跳转资源
        5. ASYNC:异步访问资源
      • web.xml配置:设置<dispatcher></dispatcher>标签即可
  • 过滤器链(配置多个过滤器)

    • 执行顺序:如果有两个过滤器:过滤器1和过滤器2
      1. 过滤器1
      2. 过滤器2
      3. 资源执行
      4. 过滤器2
      5. 过滤器1
    • 先后顺序:
      1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
      2. web.xml配置:<filter-mapping>谁定义在上边就先执行

三、登录验证

  • 访问资源,验证其是否登录
  • 如果登录了,则可直接放行
  • 如果没有登录,则跳转到登录页面,提示未登录信息
package cn.chao.web.filter;

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

public class filterCase1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //0.强制转换
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        //1.获取资源请求路径
        String uri=request.getRequestURI();
        //2.判断是否包含登录相关资源路径,要注意排除css/js/图片/验证码等资源
        if(uri.contains("/login.jsp")||uri.contains("/loginServlet")||uri.contains("/css/")||uri.contains("/js/")||uri.contains("/checkcodeServlet")){
            //包含,用户想登录,放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            //不包含,需要验证用户是否登录
            Object user = request.getSession().getAttribute("user");
            if(user!=null){
                //登录了,放行
                filterChain.doFilter(servletRequest,servletResponse);
            }else{
                //没有登录,跳转到登录页面
                request.setAttribute("login_msg","尚未登录,请登录");
                request.getRequestDispatcher("login.jsp").forward(request,servletResponse);
            }
        }
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

以上是关于Filter的主要内容,如果未能解决你的问题,请参考以下文章

JS常用代码片段2-值得收藏

filter与servlet

php代码片段: sendFile/videoStream/sendEmail/phpexcel/ffmpeg/zip

将多个输出中的hls属性设置为单独的片段代码

text 此片段用于以下知识库文章 - http://kb.wpbeaverbuilder.com/article/591-create-a-filter-to-customize-the-di

如何利用redis来进行分布式集群系统的限流设计