认识Filter(过滤器)

news2024/11/14 16:34:44

Filter介绍

在计算机编程中,Filter(过滤器)是一种用于对数据流进行处理的软件组件。Filter 的作用是从输入流中获取数据,对其进行处理后再将其写入输出流中。Filter 组件通常用于数据校验、数据转换、数据压缩等方面,以及对网络通信进行处理。在 Web 开发中,Filter 是 Servlet 标准中的一种组件,用于在 Servlet 执行之前或之后对请求和响应进行处理。可以通过 Filter 实现各种功能,如请求参数过滤、字符编码转换、请求重定向、登录验证等。使用 Filter 组件可以提高 Web 应用的易用性、安全性和可扩展性。

Filter应用场景

Filter(过滤器)是Java Servlet API中一种可以在请求和响应的处理过程中,干预或修改请求和响应的内容的组件。它主要用来过滤HTTP请求和响应,对前端的输入进行过滤,保护系统安全,提高应用的性能等。

Filter应用的场景包括:

  1. 参数校验:用户输入的参数可能包含恶意字符或参数格式错误,通过使用Filter可以拦截并进行参数校验,以保证应用安全。

  2. 多语言选择:通过获取请求头的语言参数,Filter可以根据用户的语言选择相应的语言。

  3. 登录拦截:通过Filter对所有请求进行拦截,检查用户是否登录,若未登录则跳转至登录页面。

  4. 编码转换:对于不同的请求和响应,可能需要采用不同的编码方式,Filter可以将请求和响应进行编码转换。

  5. 访问控制:通过Filter实现拦截指定路径的请求,实现权限访问控制。

以上是Filter应用的常见场景,它可以通过Java Servlet API提供的Filter接口进行实现。同时,Filter的执行顺序可以通过在web.xml中配置Filter的顺序来决定。

Filter拦截流程图:

Filter过滤敏感字符

servlet代码

package com.qcnel;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SensitiveWordsFilter implements Filter {
    private String[] sensitiveWords = {"你是猪头", "你是笨蛋"};

    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代码
    }

    public void destroy() {
        // 过滤器销毁代码
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        // 获取请求中的输入内容
        String content = httpServletRequest.getParameter("content");

        // 防止中文乱码
        response.setContentType("text/html;charset=utf-8");
        // 遍历敏感词列表,检查输入内容是否包含敏感词
        for (String sensitiveWord : sensitiveWords) {
            if (content.contains(sensitiveWord)) {
                // 如果包含敏感词,返回错误响应
                httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                httpServletResponse.getWriter().write("您提交的内容包含敏感词,请修改后重试");
                return;
            }
        }
        // 如果不包含敏感词,继续处理请求
        chain.doFilter(request, response);
    }
}

jsp代码

如果没有默认路径,就直接填上"/fl"即可

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
       <form action="/s1/fl" method="get">
          敏感字:<input type="text" placeholder="请输入敏感字" name="content"><br>
           <input type="submit">
       </form>
</body>
</html>

web.xml

大致的流程就是,浏览器先加载到jsp页面,然后再输入框输入值,提交;servlet获取到提交的值,因为servlet的敏感词需要自己添加,我们这里的敏感词是直接先放进去的,实际项目中,肯定是存在数据库中;我这里创建了数组存储敏感词,把表单获取的值跟servlet中的存储敏感词的数组进行比较,为true,则提示或者输出"****";否则false就不屏蔽,当然我这里没有设置;我这个仅仅只过滤一个页面,可以"/*"过滤多个页面;当然我这个有很多缺陷,大概就是这样的流程。希望对大家有帮助。

简单的说就是,创建数组存储敏感词,获取用户输入的值,判断是否存在敏感词,如果出现了敏感词,我们就用*号来替换或者给出提示。

Filter实现权限拦截

文件的目录

success.jsp代码,就是要登录的主页,就是内容页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>主页</title>
</head>
<body>

<h1>主页</h1>
<p><a href="/servlet/logout">注销</a></p>
</body>
</html>

login.jsp代码,登录页面,需要输入用户名,并且匹配成功

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>登录</title>
</head>
<body>
<h1>登录</h1>

<form action="/servlet/login" method="post">
  用户名:<input type="text" name="username">
  <input type="submit">
</form>

</body>
</html>

error.jsp代码,错误页面,也就是注销页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>error</title>
</head>
<body>
<h1>错误</h1>
<h3>没有权限,用户名错误</h3>
<a href="/login.jsp">返回登录页面</a>
</body>
</html>

SysFilter代码,它是一个过滤器,判断session中的USER_SESSION是否为空,如果为空,则不可以登录主页;意思就是,如果直接把主页的链接复制在浏览器回车,没有拦截,这个过滤器就是拦截的作用

package com.qing.listener;

import com.qing.util.Constant;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {


    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        //ServletRequest  HttpServletRequest
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        if(request.getSession().getAttribute(Constant.USER_SESSION) == null){
            response.sendRedirect("/error.jsp");
        }

        chain.doFilter(req,resp);
    }

    public void destroy() {

    }
}

LoginServlet代码

package com.qing.servlet;

import com.qing.util.Constant;

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

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端请求
        String username = req.getParameter("username");
        if(username.equals("admin")){ //登录成功
            req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());

            //跳转到成功页面
            resp.sendRedirect("/sys/success.jsp");
        }else { //登录失败
            resp.sendRedirect("/error.jsp");
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

LogoutServlet代码

package com.qing.servlet;

import com.qing.util.Constant;

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

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object user_session = req.getSession().getAttribute(Constant.USER_SESSION);
        //user_session != null,就说明现在在登录状态
        if(user_session != null){
            //移除Session
            req.getSession().removeAttribute(Constant.USER_SESSION);
            //重定向到登录页面
            resp.sendRedirect("/login.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

Constant代码

package com.qing.util;

public class Constant {
    public final  static String USER_SESSION = "USER_SESSION";
}

web.xml配置映射路径

 <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.qing.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/servlet/login</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.qing.servlet.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/servlet/logout</url-pattern>
    </servlet-mapping>


    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.qing.listener.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/sys/*</url-pattern>
    </filter-mapping>

代码效果执行顺序:

我的默认路径是:http://localhost:8080/

第一步:开始运行的时候,需要进入登录页面,浏览器输入"/login.jsp",如下图:

 第二步,进入到登录页面之后,输入用户名,然后提交,如果用户名正确,则跳转主页,否则跳转错误页面

第三步,提交之后,进入主页,主页有注销功能,点击注销之后,跳转到登录页面,必须输入用户名才能进入主页,而不能复制主页的url直接登录,因为filter过滤了这个请求,就相当于登进去的时候需要一个标志,表示登陆了,现在我把这个标志移除,就需要在输入账户才能进

注意:这个登录没有请求数据库

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

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

相关文章

微服务知识2

CAP和BASE是分布式必备理论基础 CAP理论 一致性(C)&#xff1a;写操作之后进行读操作无论在哪个节点都需要返回写操作的值 可用性(A)&#xff1a;非故障的节点在合理的时间内返回合理的响应 分区容错性(P)&#xff1a;当出现网络分区后&#xff0c;系统能够继续工作&#x…

家用平价洗地机哪款好?国产性价比高的品牌

在当今社会&#xff0c;人们使用清洁电器已经非常普及&#xff0c;成为了人们日常清洁中必不可少的得力助手了。洗地机在我看来&#xff0c;它在清洁力度上做的十分优秀&#xff0c;无论是干湿垃圾还是顽固污渍&#xff0c;皆可以清洗到位&#xff1b;同时&#xff0c;洗地机配…

《花雕学AI》AI 人工智能伙伴关系的指南:遵循原则,实现实践,展望未来

引言&#xff1a;人工智能&#xff08;AI&#xff09;是指由人造的机器或系统所展现出的智能&#xff0c;它可以模拟或扩展人类的认知功能&#xff0c;如学习、推理、感知、交流等。 人工智能的发展和应用已经深刻地影响了社会、经济、文化和政治等各个领域&#xff0c;同时也带…

( 数组和矩阵) 697. 数组的度 ——【Leetcode每日一题】

❓697. 数组的度 难度&#xff1a;简单 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1&#xff1a; 输…

Java异常处理传递规范总结

java 异常分类 Thorwable类&#xff08;表示可抛出&#xff09;是所有异常和错误的超类&#xff0c;两个直接子类为Error和Exception&#xff0c;分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常&#xff0c; 这两种异常有很大的区别…

Linux 概述及常用命令(一)

1、Linux 简介 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff08;主要用在服务器上&#xff09;&#xff0c;是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。 目前市面上较知名的发行版有&#xff1a;Ubuntu&#xff0c;RedHat&…

大学生创业者最关心的问题——校园外卖到底能不能盈利?

与前十年的寒窗苦读相比&#xff0c;大学自由散漫的生活略显空虚。除了学习&#xff0c;学生们还有很多时间自由安排。有些人选择颓废&#xff0c;有些人选择勤奋。而校园创业是许多有想法的大学生都会做的事情。其中&#xff0c;外卖跑腿配送是特别受欢迎的创业项目之一。 那…

五月到了,再来看看ChatGPT给我们带来了什么吧!

ChatGPT&#xff0c;即聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是美国OpenAI公司基于GPT-3.5架构&#xff08;目前已经更新到GPT-4&#xff0c;但仅限于Plus用户&#xff09;研发和强化训练的一款人工智能聊天机器人…

C++学习day--04 图形化开发环境搭建

1、为什么要搭建图形化开发环境 因为很多初学者学习C就是单纯的控制台打印输出&#xff0c;很枯燥&#xff0c;我们今后在做项目或者在学习的过程中&#xff0c;采用图形化方式相结合的方法学习&#xff0c;再学习中体会编程带来的快乐。先说明一下&#xff0c;奇牛课程是边学…

YOLOv6 4.0 使用记录:python推理 OpenCV DNN 推理

目录 1、下载源码 2、下载权重文件 3、配置环境 4、推理 6、ONNX格式导出 权重文件为yolov6list_s.pt 权重为yolov6.pt 7、opencv DNN推理 8、个人总结 1、下载源码 下载最新的4.0版本的 2、下载权重文件 我下的是YOLOv6Lite-S 3、配置环境 cd到项目目录&#xff0c;运…

关于IDEA编译运行时出现 《非法字符: ‘\ufeff‘ 需要class,interface或enum》的解决办法

问题如下 原因&#xff1a;编码问题解决办法&#xff1a;将这些报错的文件拷贝到一个目录中&#xff0c;然后用notpad打开&#xff0c;点击工具类上的 编码&#xff0c;将 以uft8格式编码 转为 以utf8无BOM格式编码&#xff0c;然后保存&#xff0c;再覆盖idea中对应的文件。或…

人脸识别--传统+深度方法

人脸识别算法--非深度方法 在前深度学习时代&#xff0c;非深度的方法探索了不同的人脸识别算法。 先考虑一下非深度学习时代&#xff0c;人脸识别难在哪&#xff1f;或者说目标识别的难点在哪&#xff1f; 图像是一个高度冗余的数据。 * 图像数据中包含大量与语义无关的内容…

Hadoop3.3.1 Windows环境配置

1.解压hadoop-3.3.1.tar.gz 到windows安装路径 D:\h3\hadoop-3.3.1 2.检查Windows jdk是否安装正常 3.下载winutils GitHub - steveloughran/winutils: Windows binaries for Hadoop versions (built from the git commit ID used for the ASF relase) 解压到D:\h3\ 并重命名…

Python每日一练(20230504) 课程表 Course Schedule I/II

目录 1. 课程表 Course Schedule I 2. 课程表 Course Schedule II &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 课程表 Course Schedule I 你这个学期必须选修 numCourses 门课程&a…

五一劳动节程序员应该知道的知识——计算机

前言 现在AI崛起&#xff0c;计算机已经成为我们不可或缺的一部分&#xff0c;几乎在所有行业和领域都有广泛应用 。 五一已经快要过去了&#xff0c;程序员们应该都放假了&#xff0c;那我们是不是应该去了解了解我们的伙伴——计算机&#xff0c;了去解计算机是怎样工作的&am…

在CSDN逮到一个字节10年老测试开发,聊过之后收益良多···

老话说的好&#xff0c;这人呐&#xff0c;一单在某个领域鲜有敌手了&#xff0c;就会闲得蛋疼。前几天我在上班摸鱼刷CSDN的时候认识了一位字节测试开发大佬&#xff0c;在字节工作了10年&#xff0c;因为本人天赋比较高&#xff0c;平时工作也兢兢业业&#xff0c;现在企业内…

REST API 最佳实践

文章目录 0.什么是 REST API&#xff1f;1.REST API 设计建议1.用名词表示资源2.用复数名词表示集合3.在端点上使用嵌套显示关系4.用 HTTP 方法操作资源5.用过滤、排序和分页请求数据6.用 JSON 作为发送和接收数据的格式7.将实际数据包装在 data 字段中8.非资源请求用动词9.考虑…

搭建环境问题集合(jupyter lab和pycharm)

1、python console找到该项目映射位置在哪里&#xff1f; import os print(os.getcwd()) 2、Linux终端运行命令&#xff0c;Ctrlc & Ctrlz 在Linux中&#xff0c;Ctrl Z组合键可以将当前正在运行的进程暂停&#xff0c;并将该进程放到后台去执行。 linux命令行下Ctrlc的作…

uniapp实现小程序打开相册或拍照上传图片附赠兼容H5方法

文章目录 前言一、支持相册选择和拍照二、删除图片三、效果图存在问题 前言 小程序上传图片&#xff0c;或者拍照上传图片&#xff0c;并附带兼容H5上传图片方法&#xff0c;压缩图片。 一、支持相册选择和拍照 支持选择相册和拍照&#xff0c;可以使用uniapp提供的api&#…

arxiv2022 | MolT5:Translation between Molecules and Natural Language

Ambitious goal &#xff01;&#xff01; 任务&#xff1a;molecule captioning and text-guided de novo molecule generation. 论文链接&#xff1a;https://arxiv.org/abs/2204.11817 代码链接&#xff1a;GitHub - blender-nlp/MolT5: Associated Repository for "…