Filter 过滤器基本内容及案例改进

news2025/1/10 21:45:42

在这里插入图片描述

举个例子
假设在Web资源中,A资源要写5行代码,而B资源也要写一模一样的5行代码,这时就把这些代码都提取出来,
在过滤器里写这些代码,因为访问任何资源都要经过过滤器,在过滤器走一遍就可以,而不用访问资源一个接一个。

应用:权限控制,用户登录之后才能查看后台信息,而Web资源中都要判断一下是否登录,而这个操作就可以放在Filter中,通用操作。

1. Filter 快速入门

在这里插入图片描述
在这里插入图片描述

创建FilterDemo,配置@WebFilter("/*")表示拦截所有,拦截记得要放行,要不然不能访问到对应的资源

在这里插入图片描述

@WebFilter("/*")
public class FilterDemo implements Filter {


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //1. 放行前,对 request数据进行处理
        System.out.println("1.FilterDemo...");

        //放行
        chain.doFilter(request,response);
        //2. 放行后,对Response 数据进行处理
        System.out.println("5.FilterDemo...");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException	{

    }

    @Override
    public void destroy() {

    }
}

2. Filter 执行流程

在这里插入图片描述

JSP的代码,验证执行的流程

<body>

    <h1>hello JSP~</h1>

    <%
        System.out.println("2.hello jsp");
    %>

</body>

过滤器代码

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //1. 放行前,对 request数据进行处理
        System.out.println("1.FilterDemo...");

        //放行
        chain.doFilter(request,response);
        //2. 放行后,对Response 数据进行处理
        System.out.println("3.FilterDemo...");
    }

控制台输出

在这里插入图片描述

3. Filter 使用细节

3.1 拦截路径配置

在这里插入图片描述

3.2 过滤器链

这里创建过滤器2

在这里插入图片描述

@WebFilter("/*")
public class FilterDemo2 implements Filter {


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //1. 放行前,对 request数据进行处理
        System.out.println("2.FilterDemo...");

        //放行
        chain.doFilter(request,response);
        //2. 放行后,对Response 数据进行处理
        System.out.println("4.FilterDemo...");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }
}

控制台打印顺序

在这里插入图片描述

当有很多过滤器时,确定执行顺序

在这里插入图片描述

4. 对登录案例进行改进

当没有进行登录时,还是通过改变URL路径来直接访问,这就存在不安全性;为了改进权限,设置过滤器,当用户已经登录过了,直接放行,未登录,返回登录页面显示未登录信息

在这里插入图片描述

创建LoginFilter

@WebFilter("/*")
public class LoginFilter 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;

        // 判断访问资源路径是否和登录注册相关
        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(req, 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);
        }
    }

    @Override
    public void destroy() {

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能优化之20个 Linux 服务器性能调优技巧

Linux是一种开源操作系统&#xff0c;它支持各种硬件平台&#xff0c;Linux服务器全球知名&#xff0c;它和Windows之间最主要的差异在于&#xff0c;Linux服务器默认情况下一般不提供GUI(图形用户界面)&#xff0c;而是命令行界面&#xff0c;它的主要目的是高效处理非交互式进…

【22】核心易中期刊推荐——人工智能与识别图像处理与应用

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

网络编程代码实例:多进程版

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;server.cclient.cMakefile 结果总结参考资料作者的话 前言 网络编程代码实例&#xff1a;多进程版。 代码仓库 yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)E…

商品如果要在美国商超出售,那么如何申请美国条形码呢?

美国条码注册是指向美国条码协会提出条码申请&#xff0c;通过条码协会的审核批准后&#xff0c;条码可以印在产品上使用。条码是进入各大商场&#xff0c;超市的身份证&#xff0c;企业有条形码&#xff0c;一是可以提高企业产品的知名度&#xff1b;二是增加产品的防伪力度&a…

TypeScript与JavaScript

目录 一、什么是javascript 二、TypeScript&#xff1a;静态类型检查器 1、类型化的 JavaScript 超集 1.1、句法 1.2、类型 1.3、运行时行为 1.4、擦除类型 2、学习 JavaScript 还是 TypeScript 一、什么是javascript JavaScript&#xff08;也称为 ECMAScript&#xf…

为何电商这么难做…...你是否忽略了这个问题?

物流时效是影响买家体验的重要环节&#xff0c;物流服务优劣也是买家网上购物时的重要参考依据。但电商企业对于快递公司的时效承诺、服务质量基本处于被动接受的状况&#xff0c;直到买家投诉才知道快递公司服务缺失&#xff0c;若买家不投诉也没法主动知道大量的订单是否按约…

Notes/Domino 11.0.1FP7以及在NAS上安装Domino等

大家好&#xff0c;才是真的好。 目前HCL在还是支持更新的Notes/Domino主要是三个版本&#xff0c;V10、11和12&#xff0c;这不,上周HCL Notes/Domino 11.0.1居然推出了FP7补丁包程序。 从V10.0.1开始&#xff0c;Domino的FP补丁包程序主要是用来修复对应主要版本中的一些问…

TCP FACK 与 RACK

3 个 dupacks 触发 fast retransmit 是一个经典启发算法&#xff0c;但在引入 SACK 之后仍然计数 SACKed 数量 > 3 触发 fast retransmit 似乎就没理由了。即使把 reordering 算进去&#xff0c;一个距离 una 很远的 seg 被 SACKed&#xff0c;也足以判定丢包了&#xff0c;…

2022公考经验分享

一、写在前面 2017南京邮电毕业后&#xff0c;5年来一直就职事业单位。单位解决北京户口&#xff0c;也赶上了一两年的忙碌期&#xff0c;存款加上公积金大概40万。期间经历过几段感情&#xff0c;2020年通过相亲认识现在的老婆。2020年12月瑞泽家园签位排名7000多&#xff0c;…

本地spingboot配置Promethus+granfana监控

记录如何配置与启动 1.在搭建好的应用加上依赖 <!-- 实现对 Actuator 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micr…

超火爆的ChatGPT课,送ChatGPT账号啦~~

HOT! HOT! HOT! &#x1f525; &#x1f525; &#x1f525; 上周&#xff0c;ChatGPT全栈开发课程一经推出&#xff0c;就在程序员圈子中引起了广泛关注。这两天 都被挤爆了&#xff0c;纷纷表示对课程内容很是期待呢。 明天就要开班直播啦&#xff0c;还未报名的同学&…

npm 打包发布一个公用的组件包

1&#xff0c;首先创建一个需要发包发布的组件 2.3使用Vue插件模式 这一步是封装组件中的重点&#xff0c;用到了Vue提供的一个公开方法&#xff1a;install。这个方法会在你使用Vue.use(plugin)时被调用&#xff0c;这样使得我们的插件注册到了全局&#xff0c;在子组件的任何…

AI在网络安全中的应用:机器学习如何帮助我们更好地保护网络

章节一&#xff1a;引言 随着信息技术的飞速发展&#xff0c;网络攻击的手段也在不断地演变。传统的网络安全技术已经难以应对日益复杂的网络安全威胁。AI技术&#xff0c;特别是机器学习技术&#xff0c;为网络安全提供了一种新的解决方案。本文将介绍AI在网络安全中的应用&am…

打造高性能的视频和弹幕系统(一): 对象存储服务

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

一文综述:自然语言处理技术NLP

自然语言处理技术综述1-到2020年 写在最前面摘要NLP简介Preprocessing预处理Tokenization令牌化、标记化Stop Words 停用词Stemming and Lemmatization词干提取和词形还原&#xff08;英文单词&#xff09;Parts-of-Speech Tagging词性标记Bag of Words and N-Grams词袋模型、N…

Redis数据库的安装(Windows10)

Redis数据库的安装 前言安装启动命令简单的几条语句 前言 本节开始学习Redis数据库。 Redis数据库的优势如下&#xff1a; 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ord…

ubuntu22.04安装显卡驱动+cuda+cudnn

ubuntu22.04安装显卡驱动cudacudnn 1. 下载驱动和卸载、禁用自带驱动程序1.1 查看系统显卡型号1.2 从NVIDIA官网下载相应驱动1.3 卸载Ubuntu自带的驱动程序1.4 禁用自带的nouveau nvidia驱动1.5 更新1.6 重启电脑1.7 查看是否将自带的驱动屏蔽 2. 安装显卡驱动2.1 停止lightdm桌…

ChatGPT 如何促进智能客服行业发展

章节一&#xff1a;智能客服的背景及发展趋势 随着人工智能技术的快速发展&#xff0c;智能客服正逐渐成为企业服务中不可或缺的一环。相比于传统客服方式&#xff0c;智能客服能够快速地为客户提供满意的解决方案&#xff0c;大幅降低企业的客服成本&#xff0c;提高客户的满意…

24、LLVM编译流程

一、LLVM 1.1 LLVM概述 LLVM是构架编译器(compiler)的框架系统,以C编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本.LLVM计划启动于2000年,最初由美国…

MybatisPlus入门和分页和条件查询里面的条件和null值的处理方式和查询投影和查询条件设置和id生成相关

MybatisPlus 简化了mybatis之前的在springboot整合MyBatis时需要自己写sql语句在接口中&#xff0c;现在只需要让接口继承BaseMapper<实体类>&#xff0c;然后在测试类中接口.增删改查方法&#xff08;&#xff09;即可 不用像springboot整合mybatis一样勾选spring web…