JavaWeb开发 - Filter过滤器详解

news/2025/1/15 21:02:29/

前言

        本章节主要学习JavaWeb开发中的Filter过滤器技术,收录于JavaWeb基础专栏,该专栏主要学习JavaWeb开发原生框架、Servlet、JSP、请求对象、响应对象、Session会话对象、Filter过滤器、三层开发模型等知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。 

目标

1. 概念

2. Filter介绍 

3. 入门案例

4. 验证登录案例

4.1 登录代码

4.2 过滤器验证


内容

1. 概念

        Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。总而言之,过滤器可以将web客户端请求进行拦截,并处理

2. Filter介绍 

        Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter。

        通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

3. 入门案例

        新建一个类,实现Filter接口,实现doFilter()方法,打印一句话,来证明能够进行拦截。

        使用注解配置过滤器请求路径。

java">package com.qls.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;/*** 过滤器:可以拦截web客户端请求,对请求进行处理(判断是否登录、权限验证、敏感词拦截等)* *//** @WebFilter注解与@WebServlet注解相似* @WebFilter("/*")拦截所有请求, * 表示所有* */
@WebFilter("/*")
public class FilterDemo1 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("过滤器拦截请求,执行代码...");//将请求放行,进入下一个过滤器,如果没有下一个过滤器,则让请求直接访问资源chain.doFilter(request, response);}
}

4. 验证登录案例

        在项目开发中,通常需要对web客户端的请求进行验证,若用户未登录,不允许访问登录资源之外的资源,比如首页信息、模块修改删除等功能。

        所以需要使用过滤器对登录之外的所有请求进行拦截,并验证用户是否已登录,如果已登录,让该请求访问资源,如果未登录,不允许访问资源,将该请求转发或重定向,跳转到登录页面使其登录。

4.1 登录代码

登录网页 login.html 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XXX系统</title>
</head>
<body><h1>用户登录</h1><form action="login" method="post"><input type="text" name="username"><br><br><input type="password" name="password"><br><br><button type="submit">登录</button></form>
</body>
</html>

处理登录请求LoginServlet.java

java">package com.qls.servlet;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.qls.utils.DBUtils;/*** 处理登录请求*/
//接收登录请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求中的用户数据String username = request.getParameter("username");String password = request.getParameter("password");//创建Session对象,用来存储用户数据HttpSession session = request.getSession();//使用工具类获取数据库连接DBUtils db = new DBUtils();try {Connection conn = db.getConn();//编写SQL语句String sql = "select username,password from user where username=? and password=?";//与处理对象PreparedStatement ps = conn.prepareStatement(sql);//设置SQL语句中的参数ps.setString(1, username);ps.setString(2, password);//执行SQL语句,获得结果集ResultSet rs = ps.executeQuery();//处理结果集while(rs.next()) {//获取结果集中的数据String uname = rs.getString("username");String pword = rs.getString("password");//判断请求中的用户数据与结果集中的用户数据是否相同if(username.equals(uname) && password.equals(pword)) {//登录成功,将用户账号信息存入Session会话对象中session.setAttribute("username", username);//请求转发 跳转到主页request.getRequestDispatcher("/user/show").forward(request, response);}else {//重定向,跳转到登录页面response.sendRedirect("login.html");}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

4.2 过滤器验证

java">package com.qls.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;/*** 验证用户是否登录* */
//拦截除登录请求之外的所有用户请求
@WebFilter("/user/*")
public class LoginFilter implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {//获取session对象 ((HttpServletRequest) request).getSession();//将ServletRequest类型的request对象转换为HttpServletRequest类型的req请求对象HttpServletRequest req = (HttpServletRequest)request;//获取session对象HttpSession session = req.getSession();//从session中获取用户数据String username = (String) session.getAttribute("username");/** 判断session中的是否有用户数据* 	若有数据,表示用户已登录,将请求放行,访问资源* 	若没有数据,表示用户未登录,将请求转发到登录页面*/if(username != null && username != "") {System.out.println("已登录");//放行chain.doFilter(request, response);}else {//未登录 跳转到指定网页req.getRequestDispatcher("login.html").forward(req, response);}}
}


http://www.ppmy.cn/news/1563425.html

相关文章

数据结构C语言描述11(图文结合)--二叉搜索树(BST树)的实现(数据采用KV存储形式进行封装)

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

首选DNS服务器地址和备用DNS服务器地址怎么设置

在计算机网络中&#xff0c;DNS&#xff08;域名系统&#xff09;服务器扮演着至关重要的角色。它负责将域名转换为 IP 地址&#xff0c;使我们能够通过易于记忆的域名访问互联网上的各种资源。而设置合适的首选DNS服务器地址和备用DNS服务器地址&#xff0c;对于保障网络连接的…

大语言模型训练数据集格式

1. SFT&#xff08;有监督微调&#xff09;的数据集格式 对于大语言模型的训练中&#xff0c;SFT&#xff08;Supervised Fine-Tuning&#xff09;的数据集格式可以采用以下方式&#xff1a; 输入数据&#xff1a;输入数据是一个文本序列&#xff0c;通常是一个句子或者一个段…

【机器学习:十二、TensorFlow简介及实现】

TensorFlow简介 1. 背景 TensorFlow是由谷歌团队开发的一种开源机器学习框架&#xff0c;最初于2015年发布&#xff0c;其主要目的是为研究人员和开发者提供一个高效、灵活且易于部署的工具&#xff0c;用于深度学习和其他机器学习任务。它支持多种平台和语言&#xff0c;包括…

Ubuntu服务器提示:检测到存在恶意文件,补救思路

1. 确定文件类型 可以使用file命令来检查该文件的类型&#xff0c;这有助于判断它是否真的是一个恶意文件 file /path/to/the/file 2. 检查文件内容 使用strings命令查看文件内容&#xff0c;看是否有可疑的命令或脚本&#xff1a; strings /path/to/the/file 3. 扫描系统…

[CTF/网络安全] 攻防世界 Web_php_unserialize 解题详析

代码审计 这段代码首先定义了一个名为 Demo 的类&#xff0c;包含了一个私有变量 $file 和三个魔术方法 __construct()、__destruct() 和 __wakeup()。其中&#xff1a; __construce()方法用于初始化 $file 变量__destruce方法用于输出文件内容__wakeup() 方法检查当前对象的…

Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践

在Java 8及更高版本中&#xff0c;Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作&#xff0c;包括筛选&#xff08;Filter&#xff09;、排序&#xff08;Sort&#xff09;、分组&#xff08;GroupBy&#xff09;、求平均值&…

从github上,下载的android项目,从0-1进行编译运行-踩坑精力,如何进行部署

因为国内的网络原因&#xff0c;一直在anroidstudio开发的问题上&#xff0c;是个每个开发者都会踩坑 一直以为是自己的原因&#xff0c;其实很多都是国内网络的原因&#xff0c;今天就从一个开发者的视角 把从github上一个陌生的项目&#xff0c;如何通过本地就行运行的 首先…