当前位置: 首页 > article >正文

JavaWeb开发 - Filter过滤器详解

前言

        本章节主要学习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()方法,打印一句话,来证明能够进行拦截。

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

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{

	@Override
	public 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

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 block
			e.printStackTrace();
		}
	}

}

4.2 过滤器验证

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{

	@Override
	public 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.kler.cn/a/503689.html

相关文章:

  • 【Redis】初识Redis
  • RuoYi-Vue-Plus 加入 GitCode:驱动多租户后台管理创新发展
  • mybatisPlus(条件构造器API)
  • html中鼠标位置信息
  • 二级C语言 2025/1/14
  • pycharm-pyspark 环境安装
  • 【OJ刷题】同向双指针问题3
  • 【机器学习】P1 机器学习绪论
  • vite之---为什么选vite
  • seleniun 自动化程序,python编程 我监控 chrome debug数据后 ,怎么获取控制台的信息呢
  • 使用Docker模拟PX4固件的无人机用于辅助地面站开发
  • MCP Server开发的入门教程(python和pip)
  • 服务器宕机原因?该怎么处理?
  • AOSP 14及以上userdebug无法调试的问题
  • wireshark开启对https密文抓包
  • c语言注意事项(不断完善版)
  • 大师课程:专业角色AE+AI动画动态设计关键帧学院视频课程 Key Frame Academy – Character Animation Launchpad
  • Java全栈项目-学生创新创业项目管理系统
  • 通过外部链接启动 Flutter App(详细介绍及示例)
  • 3D目标检测数据集——Nusence数据集
  • Linux:Makefile 以及实现第一个程序:进度条
  • 梁雨茜:用镜头架起文化桥梁,定格跨界艺术之美
  • ASP.NET Core 中的高效后台任务管理
  • 【区间DP】【hard】力扣1312. 让字符串成为回文串的最少插入次数
  • dp--校训
  • Python 扫描枪读取发票数据导入Excel