JavaWeb的Filter详解

一、Filter过滤器简介

1、基本概念

  • JavaWeb的三大组件之一,三大组件为:Servlet、Filter、Listener。

  • 过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求 进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。

2、工作方式

在这里插入图片描述

二、原始登录方式的实现 及 缺陷

1、代码实现

(1)编写登录界面

  1. 创建空工程,在工程中创建javaEE模块

  2. 配置中设置tomcat的部署

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

  3. 使用了jstl,所以需要添加依赖

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
  4. 编写login界面

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录</title>
    </head>
    <body>
    <form action="loginServlet" method="post">
        用户名:<input type="text" name="userName"><br>
        密码:<input type="password" name="password"><br>
        <span style="color:red"><%--错误提示--%>
            <c:if test="${requestScope.error != null}">
                ${requestScope.error}
            </c:if>
        </span><br>
        <input type="submit" value="登录">
    </form>
    </body>
    </html>
    
    

(2)编写Servlet

LoginServlet:

package com.example.login_demo01;

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

@WebServlet(name = "LoginServlet", value = "/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、获取页面传递的用户名和密码
        String userName = request.getParameter("userName");
        System.out.println("接收到的用户名为:" + userName);
        String password = request.getParameter("password");
        System.out.println("接收到的密码为:" + password);
        //2、使用固定的用户名和密码进行登录校验
        if ("admin".equals(userName) && "12345".equals(password)){
            System.out.println("登录成功,欢迎使用!");
            //在session中存储用户名
            request.getSession().setAttribute("userName", userName);
            response.sendRedirect("main.jsp");
        }else {
            System.out.println("用户名或者密码错误,请重新输入!");
            request.setAttribute("error", "用户名或者密码错误,请重新输入!");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }

    }
}

(3)编写main界面

main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>主界面</title>
</head>
<body>

<h1><c:out value="登录成功,欢迎${sessionScope.userName}!"></c:out></h1>

</body>
</html>

(4)测试结果

在这里插入图片描述

2、缺陷

上述代码部署完毕后,直接访问登录界面 http://localhost:8080/login_demo01/login.jsp 并没有问题,但若更换浏览器,再直接访问主界面 http://localhost:8080/login_demo01/main.jsp ,则会直接跳转到主界面,这种状态显然不合理。如下图:

在这里插入图片描述

由于request中没有值,并不能显示用户名。

三、使用Filter优化登录功能的代码演示

1、自定义类实现Filter接口并重写doFilter方法

  1. LoginFilter

    package com.example.login_demo01;
    
    import javax.servlet.*;
    import javax.servlet.annotation.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebFilter(filterName = "LoginFilter", urlPatterns = "/main.jsp")
    public class LoginFilter implements Filter {
        public void init(FilterConfig config) throws ServletException {
        }
    
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
            /**用户访问主界面过滤,只有登录的才能访问,没登录的都拦截**/
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpSession session = httpServletRequest.getSession();
            Object userName = session.getAttribute("userName");
    
            //获取servlet请求路径
            String servletPath = httpServletRequest.getServletPath();
            System.out.println(servletPath);
            //没登录,返回登录界面,已登录的放行
            if (null == userName && !servletPath.contains("login")){
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }else {
                chain.doFilter(request, response);
            }
        }
    }
    
    

2、测试:

使用一个浏览器登录成功后,再更换另一个浏览器,则会直接跳转到登录界面。

在这里插入图片描述

四、多过滤器的使用

1、过滤执行图

在这里插入图片描述

2、多过滤器的过滤顺序:

  • web.xml 注册方式,是按照映射(即filter-mapping)的顺序;
  • 注解方式注册,是按照过滤器类的字母顺序执行的。

3、代码演示(只演示注解方式)

  1. 添加一个模块,并配置tomcat

  2. 注解添加两个过滤器

    • AFilter

      package com.example.filterchain_demo02;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import java.io.IOException;
      
      @WebFilter(filterName = "AFilter", urlPatterns = "/")
      public class AFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              Filter.super.init(filterConfig);
              System.out.println(filterConfig.getFilterName() + "初始化了~");
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("请求经过了AFilter...");
              filterChain.doFilter(servletRequest, servletResponse);
              System.out.println("响应经过了AFilter...");
          }
      
          @Override
          public void destroy() {
              Filter.super.destroy();
              System.out.println("AFilter 销毁了...");
          }
      }
      
      
    • BFilter

      package com.example.filterchain_demo02;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import java.io.IOException;
      
      @WebFilter(filterName = "BFilter", urlPatterns = "/")
      public class BFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              Filter.super.init(filterConfig);
              System.out.println(filterConfig.getFilterName() + "初始化了~");
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("请求经过了BFilter...");
              filterChain.doFilter(servletRequest, servletResponse);
              System.out.println("响应经过了BFilter...");
          }
      
          @Override
          public void destroy() {
              Filter.super.destroy();
              System.out.println("BFilter 销毁了...");
          }
      }
      
      

4、测试结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake入门教程【核心篇】导入外部库Opencv

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 环境准备示例:在Windows上配置OpenCV路径示例:在Linux上配置OpenCV路径环境准备 首先确保你的系统中安装了CMake。可以通过以下命令安装: Windows: 下载并…

Transformer从菜鸟到新手(五)

引言 上篇文章我们在单卡上完成了完整的训练过程。 从本文开始介绍模型训练/推理上的一些优化技巧&#xff0c;本文主要介绍多卡并行训练。 下篇文章将介绍大模型推理常用的缓存技术。 多卡训练 第一个要介绍的是利用多GPU优化&#xff0c;因为在单卡上训练实在是太慢。这…

Camunda ServiceTask

一&#xff1a;Java class Java class实现JavaDelegate接口&#xff0c;只需要配置类的全限定名即可&#xff0c;不需要被Spring容器管理。 public class JavaClassServiceTask implements JavaDelegate {Overridepublic void execute(DelegateExecution execution) throws …

【mars3d】批量关闭矢量数据的startFlicker()闪烁或者全部关闭startFlicker()

问题 1.graphic/entity/billboard怎么能够批量关闭startFlicker()闪烁或者 全部关闭startFlicker()呢&#xff1f; 相关链接 1.http://mars3d.cn/editor-vue.html?idgraphic/entity/billboard 2.http://mars3d.cn/apidoc.html#FlickerEntity 期望效果 1.graphic.stopFlic…

【软考】二叉树的存储

目录 一、基本概念二、二叉树的顺序存储2.1 说明2.2 图示 三、二叉树的链表存储3.1 说明3.2 图示 一、基本概念 1.满二叉树&#xff1a;最深一层都没有子节点&#xff0c;其它层都有左右两个节点 2.完全二叉树&#xff1a;是满二叉树的子集&#xff0c;在完全二叉树中最深一层的…

微信小程序实战-02翻页时钟-2

微信小程序实战系列 《微信小程序实战-01翻页时钟-1》 文章目录 微信小程序实战系列前言计时功能实现clock.wxmlclock.wxssclock.js 运行效果总结 前言 接着《微信小程序实战-01翻页时钟-1》&#xff0c;继续完成“6个页面的静态渲染和计时”功能。 计时功能实现 clock.wxm…

shp格式样本转微软COCO格式样本标注

在做影像识别时&#xff0c;需要大量的样本&#xff0c;对于从事GIS和遥感专业的人员来说&#xff0c;可能使用ArcGIS对着影像&#xff0c;绘制样本效率更高。但是很多框架和开源的代码都是基于PASCAL VOC格式和微软COCO格式的样本。这里我分享一下如何将栅格和shp数据转换微软…

记录汇川:ITP与Autoshop进行仿真连接

1、定义如下程序&#xff1a; 2、ITP新建工程&#xff1a; 3、依次选择&#xff0c;最后修改IP 4、定义两个变量 5、拖一个按钮和一个圈出来&#xff0c;地址绑定&#xff1a;M1 6、地址绑定&#xff1a;Y1 7、PLC启动仿真 8、ITP启动在线模拟器 9、即可实现模拟仿真

Python中调用matplotlib库三维可视化图像像素曲面分布

为了更直观的从3D视角观察一副图像的像素分布&#xff0c;且拖动观察没一个像素细节&#xff0c;可以使用下面代码实现。 目录 一、代码二、效果展示 一、代码 使用代码修改修改的地方如下&#xff1a; 具体实现代码如下: import numpy as np import matplotlib.pyplot as …

大创项目推荐 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

python接口自动化测试框架介绍

之前在项目中搞了一套jmeter jenkins git ant接口自动化测试框架&#xff0c;在项目中运行了大半年了&#xff0c;效果还不错&#xff0c; 最近搞了一套requests unittest ddt pymysql BeautifulReport的接口自动化测试框架&#xff0c; 测试用例在yaml文件中&#xff0c…

【C语言】time.h——主要函数介绍(附有几个小项目)

time.h是C标准函数库中获取时间与日期、对时间与日期数据操作及格式化的头文件。返回值类型 size_t&#xff1a;适合保存sizeof的结果&#xff0c;类型为unsigned int&#xff08;%u&#xff09;clock_t&#xff1a;适合存储处理器时间的类型&#xff0c;一般为unsigned long&…

vue3+vite+tailwind.css无效问题,兄弟们我来解救你们了

1.按照文档配置&#xff0c;原模原样写&#xff0c;最终发现没效果。。。。。 那是应为vite.config.ts没有配置&#xff0c; 保你100%有效果&#xff01;

一次性讲清楚INNER JOIN、LEFT JOIN、RIGHT JOIN的区别和用法详解

文章目录 Join查询原理Nested-Loop JoinINNER JOIN、LEFT JOIN、RIGHT JOIN的区别INNER JOIN操作LEFT JOIN操作RIGHT JOIN操作总结 参考 Join查询原理 查询原理&#xff1a;MySQL内部采用了一种叫做 Nested Loop Join(嵌套循环连接) 的算法。Nested Loop Join 实际上就是通过 …

力扣——C语言:合并两个有序数组

88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 这道题有多种方法可以解决 一、暴力求解 这种方法最简单&#xff0c;我们只需要把两个数组合在一起然后在冒泡排序就可以了 代码如下&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2…

springboot——消息中间件

消息的概念 从广义角度来说&#xff0c;消息其实就是信息&#xff0c;但是和信息又有所不同。信息通常被定义为一组数据&#xff0c;而消息除了具有数据的特征之外&#xff0c;还有消息的来源与接收的概念。通常发送消息的一方称为消息的生产者&#xff0c;接收消息的一方称为…

OpenAI ChatGPT-4开发笔记2024-02:Chat之text generation之completions

API而已 大模型封装在库里&#xff0c;库放在服务器上&#xff0c;服务器放在微软的云上。我们能做的&#xff0c;仅仅是通过API这个小小的缝隙&#xff0c;窥探ai的奥妙。从程序员的角度而言&#xff0c;水平的高低&#xff0c;就体现在对openai的这几个api的理解程度上。 申…

Hyperledger Fabric 核心概念与组件

要理解超级账本 Fabric 的设计&#xff0c;首先要掌握其最基本的核心概念与组件&#xff0c;如节点、交易、排序、共识、通道等。 弄清楚这些核心组件的功能&#xff0c;就可以准确把握 Fabric 的底层运行原理&#xff0c;深入理解其在架构上的设计初衷。知其然&#xff0c;进…

RT-Thread 线程间同步 信号量

线程间同步 在多线程实时系统中&#xff0c;一项工作的完成往往可以通过多个线程协调的方式共同来完成。 例如一项工作中的两个线程&#xff1a;一个线程从传感器中接收数据并且将数据写到共享内存中&#xff0c;同时另一个线程周期性地从共享内存中读取数据并发送出去显示&a…

文件或目录损坏的磁盘修复方法

文件或目录损坏是一种常见的计算机问题&#xff0c;可能由多种原因导致&#xff0c;如磁盘故障、病毒或恶意软件攻击、文件系统错误等。这些损坏可能导致数据丢失或无法访问文件&#xff0c;因此及时修复至关重要。本文将深入探讨文件或目录损坏的原因&#xff0c;并提供相应的…