Servlet的过滤器

news2024/11/30 6:03:32

过滤器:

  • 使用传统的方式需要在每个页面进行验证
  • 造成代码的冗余功能重复麻烦
  • 过滤器【统计进行验证、鉴权、日志、事务】拦截请求、过滤响应

配置一个Servlet

package com.sparrow.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/18 21:02
 **/
public class LoginCheckServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if("123456".equals(password)){
            req.getSession().setAttribute("username",username);
            req.getRequestDispatcher("/manage/admin.jsp").forward(req, resp);
        }else {
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        }
        System.out.println("LoginCheckServlet被调用了..");
    }
}

配置过滤器

public class ManageFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //当fTomcat创建filter后就会调用该方法,进行初始化
        System.out.println("ManageFilter init被调用...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //每次调用该filter doFilter方法就会被调用
        System.out.println("ManageFilter doFilter被调用...");
        //在调用过滤器前,request对象已经被创建并封装
        //所以我们这里可以通过ServletRequest获取很多信息,比如访问url,session
        //比如访问的参数...就可以做事务管理 数据获取 日志管理等
        HttpSession session = ((HttpServletRequest) servletRequest).getSession();
        if (session.getAttribute("username") != null) {
            filterChain.doFilter(servletRequest, servletResponse);
        }else { //说明没有登录过..回到登录页面
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
        }
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("ManageFilter被销毁了");
    }
}

在web目录下创建login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>管理后台登录</title>
</head>
<body>
<h1>管理后台登录</h1>
<form action="<%=request.getContextPath()%>/loginCheckServlet" method="post">
    用户名: <input type="text" name="username"/><br/><br/>
    密 码: <input type="password" name="password"><br/><br/>
    <input type="submit" value="用户登录"/>
</form>
</body>
</html>

在web目录下创建manage目录,在目录下创建admin.jsp再放一张图片

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>后台管理</title>
    <base href="<%=request.getContextPath()%>/manage/"/>
</head>
<body>
<h1>后台管理</h1>
<a href="#">用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a>
<hr/>
<img src="3.png " height="300"/>
</body>
</html>

在这里插入图片描述

web.xml

    <!--Filter一般配置在最前面
    1.由tomcat管理和维护
    2.url-pattern就是当前请求的url 匹配的时候就会调用filter
    3./manage/* 第一个 / 解析成HTTP://ip:port/工程路径
    4.完整的路径使http://ip:port/工程路径/manage* 当请求的资源url满足该条件时就会调用filter
    -->
    <filter>
        <filter-name>ManageFilter</filter-name>
        <filter-class>com.sparrow.filter.ManageFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ManageFilter</filter-name>
        <url-pattern>/manage/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LoginCheckServlet</servlet-name>
        <servlet-class>com.sparrow.servlet.LoginCheckServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginCheckServlet</servlet-name>
        <url-pattern>/loginCheckServlet</url-pattern>
    </servlet-mapping>

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

Filter过滤器url-pattern

  1. url-pattern:Filter的拦截路径,即浏览器在请求什么位置的资源时,过滤器会进行拦截过滤
  2. 精准匹配<url-pattern>/a.jsp</url-pattern>对应的请求地址http://ip[域名]:port/工程路径/a.jsp会拦截
  3. 目录匹配<url-pattern>/manage/*</url-pattern> 对应的请求地址http://ip[域名]:port/工程路径/manage/xx,即web工程manage目录下所有资源会拦截
  4. 后缀名匹配<url-pattern>*.jsp</url-pattern>后缀名可变,比如*.action *.do 等等对应的请求地址http://ip[域名]:port/工程路径/xx.jsp,后缀名名为.jsp请求会拦截
  5. Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在

Filter的生命周期

  1. Filter在web启动时,由tomcat来创建filter实例,只会创建一个
  2. 会调用filter默认的无参构造器,同时会调用init方法,只会调用一次
  3. 在创建filter实例时,同时会创建一个FilterConfig对象,并通过init方法传入
  4. 通过filterConfig对象,可以获取该filter的相关配置信息
  5. 当一个HTTP请求和该filter的url-pattern匹配时,就会调用doFilter方法
  6. 在调用doFilter方法,tomcat会同时创建ServletRequestServletResponseFilterChain对象,并通过doFilter传入
  7. 如果后面的请求目标资源(jsp,serlvet…)会使用到request和response,那么会继续传递

FilterConfig

public class SparrowFilterConfig implements Filter {

    private String ip; //从配置文件中获取ip
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //通过filterConfig获取相关的参数
        String filterName = filterConfig.getFilterName();
        ip = filterConfig.getInitParameter("ip");
        ServletContext servletContext = filterConfig.getServletContext();
        Enumeration<String> parameterNames = filterConfig.getInitParameterNames();
        while (parameterNames.hasMoreElements()) {
            System.out.println("名字=" + parameterNames.nextElement());
        }

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //通过forbidden ip来控制
        //先获取到访问ip
        String remoteAddr = servletRequest.getRemoteAddr();
        if (remoteAddr.contains(ip)) {
            System.out.println("封杀该IP");
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
        }
    }

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

FilterChain过滤器链

  1. 多个Filter和目标资源在一次HTTP请求,在同一个线程中
  2. 当一个请求url和filter的url-pattern匹配时,才会被执行,如果有多个匹配上,就会顺序执行,形成一个filter调用链(底层可以使用一个数据结构搞定)
  3. 多个filter共同执行时,因为是一次HTTP请求,使用同一个request对象
  4. 多个filter执行顺序和web.xml配置顺序保持一致
  5. chain.doFilter(req,resp)方法 将执行下一个过滤器的doFilter方法,如果后面没有过滤器,则执行目标资源
  6. 注意执行过滤器链时,顺序是HTTP请求->A过滤器doFilter()->A过滤器前置代码->A过滤器chain.doFilter()->B过滤器doFilter()->B过滤器前置代码->B过滤器chain.doFilter()->目标文件->B过滤器后置代码->A过滤器后置代码->返回给浏览器页面/数据
public class AFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("AFilter~~~" + Thread.currentThread().getId());

        System.out.println("AFilter doFilter的前置代码");
        System.out.println("执行AFilter ");
        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("AFilter doFilter的后置代码");
    }
}

public class BFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("BFilter~~~" + Thread.currentThread().getId());
        System.out.println("BFilter doFilter的前置代码");
        System.out.println("执行BFilter ");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("BFilter doFilter的后置代码");
    }

}

    <filter>
        <filter-name>AFilter</filter-name>
        <filter-class>com.sparrow.filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>BFilter</filter-name>
        <filter-class>com.sparrow.filter.BFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>BFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

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

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

相关文章

华为鲲鹏920 aarch64 版本 Ambari HDP 下载地址

声明&#xff1a;为有效缓解各位同行兄弟们的痛&#xff0c;特推出此文 本文能够适配兼容 华为鲲鹏920 aarch64 版本&#xff0c;仅限 CentOS7、openEuler20.03-LTS 操作系统 以下是详细下载地址 1、CentOS7 aarch64版本 CentOS7 aarch64 https://mirrors.huaweicloud.com/…

C# 抽象类和接口详解

参考视频链接&#xff1a;https://www.bilibili.com/video/BV13b411b7Ht?p27&vd_source10065785c7e10360d831474364e0d3e3 代码的进化与重构&#xff0c;从基本代码的讲解到逐步抽象成抽象类和接口。 文章目录 最初定义利用继承改进对方法进一步改进利用虚函数进行改进利…

设计模式结合场景(1)——支付场景(策略+工厂+模板)

ps&#xff1a;以下示例仅供参考&#xff0c;设计模式只是一种思想&#xff0c;至于怎么千变万化就看大家了。 一、背景 面试官&#xff1a;你们项目的支付场景用了哪些设计模式&#xff0c;为什么要这么做&#xff1f; 二、方案 使用策略模式定义不同支付方式的具体支付策略&…

[深度学习实战]基于PyTorch的深度学习实战(上)[变量、求导、损失函数、优化器]

目录 一、前言二、深度学习框架——PyTorch2.1 PyTorch介绍2.2 Python安装详解2.3 PyTorch安装详解 三、变量四、求导五、损失函数5.1 nn.L1Loss5.2 nn.SmoothL1Loss5.3 nn.MSELoss5.4 nn.BCELoss5.5 nn.CrossEntropyLoss5.6 nn.NLLLoss5.7 nn.NLLLoss2d 六、优化器Optim 6.1 …

ARM Coresight 系列文章 8 - ARM Coresight 通过 APBIC 级联使用

文章目录 APBIC 回顾APBIC 级联 上篇文章&#xff1a;ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 异构 cpu 内部 coresight 组件 APBIC 回顾 APBIC 可以连接一个或者多个APB BUS masters&#xff0c; 例如连接一个 APB-AP 组件和带有 APB 接口的 Processor&…

Java源码规则引擎:jvs-rules数据扩展及函数配置说明

jvs-rules数据拓展节点 数据拓展是数据可视化加工过程中的重要工具&#xff0c;它核心的作用是对原有数据表进行加工扩展&#xff0c;实现功能如下图所示 函数配置操作过程 操作说明 1、拖动数据拓展字段&#xff0c;并将字段拓展与之前的历史节点连接起来&#xff0c;点击数…

浅谈linux前台进程与后台进程同步异步执行的理解

最近书上看到前台进程以及后台进程的定义&#xff0c;有点令人费解。 linux终端输入一条命令&#xff0c;创建一个子进程运行这条命令&#xff0c;在这条命令进程执行完之前&#xff0c;终端shell都无法接收新的一条命令&#xff1b;只有这条命令运行结束后&#xff0c;当前终…

Vue项目实现在线预览pdf,并且可以批量打印pdf

最近遇到一个需求,就是要在页面上呈现pdf内容,并且还能用打印机批量打印pdf,最终效果如下: 当用户在列表页面,勾选中两条数据后,点击“打印表单”按钮之后,会跳到如下的预览页面: 预览页面顶部有个吸顶的效果,然后下方就展示出了2个pdf文件对应的内容,我们接着点击“…

Vsiual Stdio 生成动态链接库 / 命令行CMD工具打不开 / 64和32位动态链接库生成 dll

打开vistual studio&#xff0c;选择目标文件夹。 菜单栏选择工具->命令行->开发者命令提示 通过 这种方法打开的编译器版本是 32位&#xff08;x86&#xff09;的 64位的编译器通过以下方法打开 修改文件路径 1)Cd 路径 2) 盘符&#xff1a; 输入命令行代码 cl /c Se…

SpringBoot整合SpringSecurity+JWT

SpringBoot整合SpringSecurityJWT 整合SpringSecurity步骤 编写拦截链配置类&#xff0c;规定security参数拦截登录请求的参数&#xff0c;对该用户做身份认证。通过登录验证的予以授权&#xff0c;这里根据用户对应的角色作为授权标识。 整合JWT步骤 编写JWTUtils&#xf…

精智达在科创板上市:募资约11亿元,深创投等为其股东

7月18日&#xff0c;深圳精智达技术股份有限公司&#xff08;下称“精智达”&#xff0c;SH:688627&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;精智达的发行价为46.77元/股&#xff0c;发行数量为2350.2939万股&#xff0c;募资总额为10.99亿元&#xff0c;…

封装cpp-httplib成dll包,为老项目提供http网络支持

项目介绍&#xff1a; 公司内某些老的项目不支持https或者http1.1的一些新功能&#xff0c;需要开发对应的SDK供其调用&#xff0c;以便维护老项目。 第一步&#xff1a;下载cpp-httplib 点击这里去下载最新的代码&#xff1a;mirrors / yhirose / cpp-httplib GitCode 直接下…

QT:问题、解决与原因

在这里记录一些自己遇到的在QT开发上面的小问题和tips 目录 QComboBox 设置qss样式不生效qt按钮设置点击释放效果实现效果 QComboBox 设置qss样式不生效 我设置的样式是&#xff1a; box->setStyleSheet("QComboBox {""border: none;""padding:…

适用于 Type-C接口PD应用的智能二极管保护开关

日前&#xff0c;集设计、研发、生产和全球销售一体的著名功率半导体、芯片及数字电源产品供应商Alpha and Omega Semiconductor Limited&#xff08;AOS, 纳斯达克代码:AOSL) 推出一款采用理想二极管运作进行反向电流保护的新型Type-C PD 高压电源输入保护开关。AOZ13984DI-02…

上市公司前端开发规范参考

上市公司前端开发规范参考 命名规则通用约定文件与目录命名HTML命名CSS命名JS命名 代码格式通用约定HTML格式CSS格式JS格式注释 组件组件大小单文件组件容器组件组件使用说明Prop指令缩写组件通讯组件的挂载和销毁按需加载第三方组件库的规定 脚手架使用规范移动端脚手架PC端脚…

Linux下安装Elasticsearch以及ES-head插件

Linux下安装ElasticSearch以及ES-head插件 安装Elasticsearch 由于Elasticsearch客户端版本和ElasticSearch版本有对应关系&#xff0c;所以建议安装之前先考虑安装哪个版本的ElasticSearch。 ElasticSearch、Spring Data Elasticsearch、SpringBoot、Spring版本对应关系 安…

OpenCV for Python 学习第五天:图片属性的获取

上一篇博文当中&#xff0c;我们学习了如何获取图片的通道&#xff0c;我们了解了通道的分离方法split()和通道的组合方法merge()。那么我们今天就来对图片的属性做一个深入的了解。 文章目录 图片属性OpenCV中属性介绍图片属性的获取 图片属性 图片属性是指描述和定义一张图片…

爬虫与反爬虫的攻防对抗

一、爬虫的简介 1 概念 爬虫最早源于搜索引擎&#xff0c;它是一种按照一定的规则&#xff0c;自动从互联网上抓取信息的程序&#xff0c;又被称为爬虫&#xff0c;网络机器人等。按爬虫功能可以分为网络爬虫和接口爬虫&#xff0c;按授权情况可以分为合法爬虫和恶意爬虫。恶…

【NLP】从预训练模型中获取Embedding

从预训练模型中获取Embedding 背景说明下载IMDB数据集进行分词下载并预处理GloVe词嵌入数据构建模型训练模型并可视化结果结果对比其他代码 在NLP领域中&#xff0c;构建大规模的标注数据集非常困难&#xff0c;以至于仅用当前语料无法有效完成特定任务。可以采用迁移学习的方法…

hbuilder创建基于vue2的uniapp小程序项目

参考vant官网&#xff1a;https://vant-contrib.gitee.io/vant/v3/#/zh-CN/quickstart#an-zhuang官网 参考别人博客&#xff1a;https://www.yii666.com/blog/465379.html 1.创建项目 1.1 hbuilder进去右上角点击文件–新建–项目 1.2 vue2项目如下图 2.安装依赖 2.1 2.2…