首页 > 其他分享 >10.Filter

10.Filter

时间:2023-01-09 09:24:57浏览次数:63  
标签:10 void Filter servletResponse 放行 拦截 public

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() {}
    }
    

标签:10,void,Filter,servletResponse,放行,拦截,public
From: https://www.cnblogs.com/wenjie2000/p/17035281.html

相关文章

  • 图文并茂windows10安装VMware创建CentOS-7-x86_64运行linux系统
    VMware是什么VMWare(VirtualMachineware)可以使你的计算机上同时运行几个系统、例如windows、DOS、LINUX等同时存在,可以将这些系统像程序似的随时切换,并且不会影响主......
  • 代码随想录算法训练营第11天 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 1
    20.有效的括号文章:代码随想录(programmercarl.com)视频:栈的拿手好戏!|LeetCode:20.有效的括号_哔哩哔哩_bilibili思路:先来分析一下这里有三种不匹配的情况,第一种......
  • 10(结构型模式)java设计模式之代理模式
    一、什么是代理模式简介:代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。为其他对象提供—种代理以控制对这个对象的......
  • JavaWeb三大组件之过滤器-Filter
    1.Filter过滤器Filter过滤器是javaEE的规范,是接口(javax.servletInterfaceFilter) 2.过滤器作用-拦截请求,过滤响应情景引入:浏览器访问tomcat的login页面,进行登录验证......
  • 12.30-0108文献阅读总结
      本周是论文研读第一周,可是一篇都没有仔细读完,怎样才算仔细研读呢,心里的标准是这样的:  1、从一定程度上区分筛选出好论文;  2、对作者及研究机构分析,在大实验的官......
  • 插入排序10-3
    ///<summary>///插入排序///从第2个数开始,跟第一个数对比,放在左边还是右边///循环下去比较,都放在合适的位置///</summary>///<paramname="arr"></param>publi......
  • CF1088C
    Solution一个很简单的想法就是将整个序列变成\(1\)到\(n\),这时我们需要对每个\(a_i\)执行\(\bmod(a_i-i)\)的操作,但是可能\(a_i<i\),所以我们只需要在一开始加上......
  • 红米AC2100 钛星人固件,用ttl刷回breed
    目录准备拆机准备刷回开始刷入breed参考资料去年手贱不小心把RM2100刷成钛星人固件,想要刷回来找不到方法,趁着这段时间回家又折腾了一下准备工具:杜邦线、电烙铁(非必须,有......
  • 安装蓝叠安装模拟器在Windows10
      下载地址:https://www.bluestacks.com/download.html     如果想使用模拟器打开tiktok的话可以如下操作 ......
  • 230108_50_RPC底层原理
    Stub还有很多需要优化的地方,目前只是实现了一个最基本的代理。网络传输都是通过序列化和反序列化进行的,目前java自带的Serializable接口效率比较低,因此可以对rpc的序列化......