java基础篇---Servlet过滤器

article/2025/10/15 9:24:58

Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。

过滤器的基本概念

Filter是在Servlet 2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源的时候,就可以使用过滤器完成。
过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。
实现过滤器 
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了三个操作方法:
  • public void init(FilterConfig filterConfig) throws ServletException
  • public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException
  • public void destroy()
FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者是Servlet:
  • public void doFilter(ServletRequest request,ServletResponse response) throws IOException,ServletException
在FilterChain接口中依然定义了一个同样的doFilter()方法,这是因为在一个过滤器后面可能存在着另外一个过滤器,也可能是请求的最终目标(Servlet),这样就通过FilterChain形成了一个“过滤链”的操作,所谓的过滤链就类似于生活中玩的击鼓传花游戏 
定义一个简单的过滤器 —— SimpleFilter.java
package com.oumyye.过滤器;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SimpleFilter implements Filter {public void init(FilterConfig config) throws ServletException {    // 初始化过滤器String initParam = config.getInitParameter("ref");     // 取得初始化参数System.out.println("** 过滤器初始化,初始化参数 = " + initParam);}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {    // 执行过滤System.out.println("** 执行doFilter()方法之前。");chain.doFilter(request, response);         // 将请求继续传递System.out.println("** 执行doFilter()方法之后。");}public void destroy() {                // 销毁过滤System.out.println("** 过滤器销毁。");}
}

配置web.xml

<filter><filter-name>simple</filter-name><filter-class>com.oumyye.过滤器.SimpleFilter</filter-class>
<init-param>
<param-name>ref</param-name>
<param-value>HELLOMLDN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>simple</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

过滤器的应用  —— 编码过滤 

在进行WEB开发中,编码过滤是必不可少的操作,如果按照之前的做法,在每一个JSP或者是Servlet中都重复编写“request.setCharacterEncoding("UTF-8")”的语句肯定是不可取的,会造成大量的代码重复,那么此时就可以通过过滤器完成这种编码过滤。 
package com.oumyye.过滤器;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {private String charSet;             // 设置字符编码public void init(FilterConfig config) throws ServletException {this.charSet = config.getInitParameter("charset"); // 取得初始化参数
    }public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(this.charSet);     // 设置统一编码
    }public void destroy() {
} }

配置web.xml文件 

    <filter><filter-name>encoding</filter-name><filter-class>com.oumyye.过滤器.EncodingFilter</filter-class><init-param><param-name>charset</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>

过滤器的应用---登陆验证 

登陆验证是所有WEB开发中不可缺少的部分,最早的做法是通过验证session的方式完成,但是如果每个页面都这样做的话,则肯定会造成大量的代码重复,而通过过滤器的方式就可以避免这种重复的操作。
在这里需要注意的是,session本身是属于HTTP协议的范畴,但是doFilter()方法中定义的是ServletRequest类型的对象,那么要想取得session,则必须进行向下转型,将ServletRequest变为HttpServletRequest接口对象,才能够通过getSession()方法取得session对象。 
package com.oumyye.过滤器;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;public class FilterLogin extends HttpServlet implements Filter {private FilterConfig filterConfig;public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;}public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws ServletException,IOException {HttpSession session=((HttpServletRequest)request).getSession();response.setCharacterEncoding("gb2312");    //响应客户端类型if(session.getAttribute("user")==null){        //判断session中是否有user这个对象PrintWriter out=response.getWriter();        //创建一个输出流//如果为空则通过javaScript脚本出输出提示并跳转到index.jsp页面out.print("<script language=javascript>alert('您还没有登录!!!');window.location.href='../index.jsp';</script>");}else{filterChain.doFilter(request, response);//否则继续执行
       }}public void destroy() {}
}

User.java

package com.mr.filter;public class User {private String username;private String password;public String getUsername() {return username;}public String getPassword() {return password;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}}

配置web.XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
<filter><filter-name>filterUser</filter-name><filter-class>com.oumyye.过滤器.FilterLogin</filter-class></filter><filter-mapping><filter-name>filterUser</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

jsp页面:

index.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="css/style.css" rel="stylesheet" type="text/css" >
<script language="javascript" type="">
function checkEmpty(){
if(document.form.name.value==""){
alert("用户名不能为空")
document.form.name.focus();
return false;
}
if(document.form.password.value==""){
alert("密码不能为空")
document.form.password.focus();
return false;
}
}
</script><title>使用过滤器身份验证</title>
</head><body>    <h3>&nbsp;</h3><p align="center">使用过滤器身份验证</p><form name="form" method="post" action="loginresult.jsp" onSubmit="return checkEmpty()">
<table width="220"  border="1" align="center" cellpadding="0" cellspacing="0" bgcolor="808080"><tr><td align="center">用户名:</td><td ><input name="name" type="text"></td></tr><tr><td align="center">密&nbsp;&nbsp;码:</td><td><input name="password" type="password"></td></tr><tr><td align="center" colspan="2">          <input type="submit" name="Submit" value="登录"><input type="submit" value="退出"/></td></tr>
</table><br>
</form></body>
</html>

loginresult.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" %>
<%@ page import="com.mr.filter.User"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>使用过滤器身份验证</title>
</head>
<%
request.setCharacterEncoding("gb2312");
String name=request.getParameter("name");
String password=request.getParameter("password");User user=new User();user.setUsername(name);user.setPassword(password);session.setAttribute("user",user);response.sendRedirect("filter/loginsuccee.jsp");
%>
<body>
</body>
</html>

loginsuccee.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="com.mr.filter.User"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>使用过滤器身份验证</title>
</head>
<body><div align="center"><table width="333" height="285" cellpadding="0" cellspacing="0"><tr><td align="center"><p>您己成功登录</p><p><br><a href="backtrack.jsp">返回</a></p></td></tr>
</table>
</div></body>
</html>

backtrack.jsp

<%
session.invalidate();
out.print("<script language='javascript'>window.location.href='../index.jsp';</script>");
%>

 小结:

过滤器属于自动执行的一种Servlet;
过滤器依然需要在web.xml文件中进行配置;
过滤器的常见功能是可以完成编码过滤及登陆验证

http://chatgpt.dhexx.cn/article/s4hG42VO.shtml

相关文章

mac下idea卡顿问题解决

一、背景 mac下idea卡顿 二、原因 赋予idea的内存太小了&#xff0c;需要给他更大的内存 三、解决方法 1、修改idea.vmoptions 配置文件。 help --Edit Custom VM Options 2、修改文件 这是我修改之前的&#xff1a; -Xms128m -Xmx750m -XX:ReservedCodeCacheSize512m…

macOS看视频卡顿如何修复

很多时候我们都会遇到这样一个问题&#xff1a;明明电脑很新&#xff0c;处理器内存什么的也都不差&#xff0c;但看在线视频就是卡&#xff0c;画面和音频对不上&#xff0c;令人很难受。其实这是Flash播放器开了P2P的原因。今天我就教教大家macOS看视频卡顿如何修复。 先打开…

MAC 外接键盘卡顿处理

系统偏好设置-> 键盘。 1&#xff1a;将『按键重复』调到快&#xff0c;将『重复前延迟』调到段&#xff0c;点击『更改键盘类型』,并且按照提示一步步让电脑识别键盘。 2 &#xff1a;切换『文本』&#xff0c;去勾『触控栏键入建议』&#xff0c;可以起到调优作用。

MAC如何解决idea卡顿问题

故事是这样的 我的mac配置也不是很高&#xff0c;内存大概是这样的 但是刚下载完idea后&#xff0c;简直比我之前2000块的windows本都卡。偶买噶&#xff0c;差点想直接退货。 好在控制住脾气&#xff0c;然后冷静思考后觉得&#xff0c;不该呀&#xff0c;好歹那么贵&#x…

matlab java mac_Matlab for mac卡顿、抛Java异常

在苹果上使用Matlab后&#xff0c;试用了几个版本后都十分卡顿&#xff0c;后来抛出了Java.lang.OutOfMemoryError. 后查阅资料认为可能是Matlab JVM内存不够的问题。官方给出的解决方案如下&#xff0c;将JVM内存设置到最大后&#xff0c;情况有所缓解。有时候仍然有些卡 但是…

解决 Macbook 连接蓝牙鼠标卡顿问题

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。会造成蓝牙鼠标卡顿具体解决办法如下&#xff1a; 打开“系统偏好设置”——“网络”&#xff0c;然后选择更多这里&#xff08;如图&#xff09…

优化不必要的动画,以减少Mac卡顿

本文通过两种方式来减少Mac的动画&#xff0c;友情提示&#xff1b;常重启有助于保持Mac系统正常运转。 条件允许的情况下&#xff0c;安装旧版本Mac系统、减少运行不必要的软件能优化Mac运行速度。 一、系统设置 打开系统偏好设置——>辅助功能 勾选 “减弱动态效果” …

终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移

终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移 Intel处理器机器/旧版Mac系统Apple M系列新机器 Intel处理器机器/旧版Mac系统 找到如图设置&#xff0c;修改网络首选项顺序 Apple M系列新机器 1、在系统设置里新建一个管理员用户 2、在访达-前往-电脑-磁盘-找到新建…

m1 MacBook Pro pycharm打字卡顿问题解决

一般m1芯片的MacBook Pro在pycharm中打字卡顿无非两种情况导致的&#xff0c;一种是分配给pycharm编辑器的内存太小&#xff1b;另一种是下载的版本与m1芯片版本不一致&#xff0c;不兼容导致的卡顿&#xff0c;下面文章详细记录了解决这两种情况的方法。 一、内存不足导致的卡…

Macbook Pro 鼠标卡顿问题

Macbook Pro 鼠标卡顿问题 目前无解&#xff0c;只能改善。该问题最早能追溯到 2015年。 https://jingyan.baidu.com/article/ff42efa93632c5c19e220208.html 原因 据说是无线频段冲突。 罗技低于400 的鼠标就别看了&#xff0c;白花钱。 鼠标在 macbook pro 的卡顿现象主要表现…

解决 Macbook 连接蓝牙鼠标卡顿、飘的现象

原因&#xff1a; 1. 鼠标蓝牙缺陷&#xff0c;蓝牙版本低&#xff0c;电池电量低&#xff1b; 2. 电脑性能卡顿和功能优先度&#xff1b; 3. 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。 这里以解决2和3的问题。 打开“系统偏好设置”——“网络”&#…

Mac卡顿问题处理

导读 1.文件清理 2.网络卡顿问题 文件清理 网络卡顿问题

苹果电脑mac系统运行卡顿 反应慢怎么办?

Mac电脑以生产力著称&#xff0c;卡顿几乎很少发生。但是随着日常的使用&#xff0c;系统空间越来越多&#xff0c;随之而来的问题就是存储空间不足&#xff0c;无法保存文件。如果mac同时运行的软件过多&#xff0c;也会造成卡顿&#xff0c;所以mac电脑并不是不会卡顿&#x…

mac电脑运行很卡不流畅,如何给mac提速?

是不是发现你的 Mac 越用越慢&#xff1f;没错&#xff0c;任何电子设备&#xff0c;随着使用时间的增加&#xff0c;都会出现不如刚买时那么流畅的问题。论其究竟&#xff0c;除了硬件随着时间的损耗&#xff0c;其实还有一部分原因是日常留下的“使用痕迹”和自启动的应用程序…

MacBook苹果笔记本电脑卡顿怎么解决?

MacBook使用时间久了之后很容易出现卡顿的问题。那么出现卡顿的原因有哪些呢&#xff1f;MacBook卡顿怎么处理呢&#xff1f;下面为大家介绍几种可能的解决方案。虽然mac系统相对来说比较稳定&#xff0c;但遇到软件崩溃的情况也会突然卡顿而无法使用。那么&#xff0c;遇上mac…

苹果mac卡顿怎么解决呢?轻松几招让你Mac流畅如新

Mac电脑使用一段时间后就会偶尔发生卡顿的现象&#xff0c;苹果mac卡顿怎么解决呢&#xff1f;这里macw小编为大家带来轻松几招让你Mac流畅如新的方法&#xff0c;一起来看看吧&#xff01;Mac电脑为什么会出现卡顿现象&#xff1f; 因为程序在运行中&#xff0c;所占用资源过高…

为什么mac会卡顿,mac电脑卡顿怎么解决

在正常的运行下&#xff0c;mac系统相对来说是比较流畅的&#xff0c;不容易出现卡顿的现象。如果出现mac卡顿的话&#xff0c;可能是外部环境或应用程序问题引起的。接下来&#xff0c;一起来详细了解下为什么mac会卡顿&#xff0c;mac电脑卡顿怎么解决的相关问题吧。 一、为…

pgAdmin

1.如果postgresql安装的是9.0或以上版本&#xff0c;pgAdmin必须安装1.12版本或以上&#xff0c;否则报错如下&#xff1a; ERROR: column "datconfig" does not exist LINE 1: ...b.dattablespace AS spcoid, spcname, datallowconn, datconfig, .... I click …

pgAdmin的介绍 及使用

1. pgAdmin的介绍 pgAdmin 4是一款专门针对PostgreSQL数据库的客户端管理软件&#xff0c;该版本在pgAdmin 3的基础上做了较大的架构变化&#xff0c;由之前的CS架构变更为基于浏览器的BS架构。 2019年1月10日&#xff0c;pgAdmin全球开发组在其官网上发布了最新版本pgAdmin 4…

PGP的安装及使用

PGP的安装及使用 一、PGP的安装及汉化1.安装2.汉化 二、创建用户及密钥三、PGPkeys的使用1.导出自己的公钥2.使用公钥加密文件3.使用私钥解密文件 一、PGP的安装及汉化 PGP Desktop Pro V10.0.3 链接&#xff1a;https://pan.baidu.com/s/1fMdahQxPDr6mzoVukKxHjg 提取码&…