10.Filter

Filter

笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

视频教程(P134~P136)

  • 概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。

  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

  • 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等...

Filter快速入门

  1. 定义类,实现Filter接口,并重写其所有方法

    import javax.servlet.*;//注意pom.xml要导入javax.servlet依赖
    import java.io.IOException;
    
    public class FilterDemo implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {}
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}
        @Override
        public void destroy() {}
    }
    
  2. 配置Filter拦截资源的路径:在类上定义@WebFilter注解

    @WebFilter("/*")
    public class FilterDemo implements Filter {
        ...
    
  3. 在doFilter方法中输出一句话,并放行

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter被执行了...");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
    

Filter执行流程

  1. 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?

  2. 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?放行后逻辑

    graph LR A(执行放行前逻辑)-->B(放行)-->C(访问资源)-->D(执行放行后逻辑)

Filter使用细节

Filter拦截路径配置

  • Filter可以根据需求,配置不同的拦截资源路径

    拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截。

    目录拦截:/user/*:访问/user下的所有资源,都会被拦截

    后缀名拦截: *.jsp:访问后缀名为jsp的资源,都会被拦截

    拦截所有:/*:访问所有资源,都会被拦截

过滤器链

  • 一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链

  • 注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序(类似手机中联系人按照ABCD排序)

案例

登录验证

  • 需求:访问服务器资源时,需要先进行登录验证,如果没有登录,则自动跳转到登录页面

    package com.itwen.web.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class FilterDemo implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {}
        
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest req= (HttpServletRequest) servletRequest;
            //判断访问资源是否和登录注册相关
            //如果不进行判断,那么获取页面中的图片、css文件等资源等数据资源时,也会被该filter拦截,导致页面不能正常显示
            String[] urls={"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
            //获取当前资源路径
            String url = req.getRequestURL().toString();
            //循环判断
            for (String u : urls) {
                if (url.contains(u)){
                    //找到了
                    //放行
                    filterChain.doFilter(servletRequest,servletResponse);
                    return;
                }
            }
            //1.判断session中是否有user
            HttpSession session = req.getSession();
            Object user = session.getAttribute("user");
            //2.判断user是否为null
            if (user!=null){
                //已登录
                //放行
                filterChain.doFilter(servletRequest,servletResponse);
            }else {
                //未登录
                //存储提示信息,跳转到登录页
                req.setAttribute("login_msg","尚未登录!");
                req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);
            }
            System.out.println("Filter被执行了...");
        }
        
        @Override
        public void destroy() {}
    }
    
posted @ 2023-01-09 09:06  文杰2000  阅读(17)  评论(0编辑  收藏  举报