Servlet——过滤器

article/2025/10/15 9:15:11

Servlet过滤器

什么是过滤器

过滤器是一个程序,它先于与之相关的Servlet页面运行在服务器上,但它并不是一个标准的Servlet,它不能处理用户请求,也不能对客户端生成响应。它主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理。过滤器可以附加到一个或多个Servlet、JSP页面或者是HTML静态页面上,然后检查进入这些资源的请求信息。它对这些请求进行拦截,从而实现一些特殊的功能,比如可以实现权限访问控制,过滤敏感词汇,设置统一字符集等功能。

  • 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应
  • 在请求到达Servlet或者JSP之前,过滤器截获请求
  • 在响应送给客户端之前,过滤器截获响应
  • 多个过滤器可以形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射<filter-mapping>的顺序决定

Servlet过滤器的基本原理

在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成之后,它会交给下一个过滤器处理,这样,客户的请求在过滤器链中逐个处理,直到请求发送到目标为止。例如,我们访问用户管理系统的某个页面,服务器在进行处理时需要做两项工作:①判断客户端的会话是否有效然后检查权限;②对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤器链中进行处理。当过滤器处理成功后,再把提交的数据发送到最终目标。

可以看一下过滤器链在整个Web应用中的位置:

过滤器

Servlet过滤器开发以及部署步骤

过滤器的开发

开发Servlet过滤器的步骤为:
1.编写实现Filter接口的Servlet类。
2.在web.xml中配置Filter

开发一个过滤器需要实现Filter接口,Filter接口定义了以下方法:

destory()由web容器调用,销毁此Filter
init(FilterConfig filterConfig)由Web容器调用,初始化此Filter
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)具体处理过滤的代码

一个过滤器的代码类似如下,其中最重要的是在doFilter()方法中的实现自己对request和response的过滤:

public class MyFilter implements Filter {@Overridepublic void destroy() {//销毁代码}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain chain) throws IOException, ServletException {//具体的过滤细节}@Overridepublic void init(FilterConfig arg0) throws ServletException {//初始化代码}
}

过滤器的部署

过滤器的部署细节与Servlet很相似,Servlet是要配置<servlet><servlet-mapping>,而过滤器是要配置<filter><filter-mapping>

配置如下所示,假设我的Filter放在com.gavin.filter包下:

<filter><filter-name>FilterName</filter-name><filter-class>com.gavin.filter.FilterName</filter-class></filter>

配置mapping的方法有很多种,根据映射到Servlet或者JSP的不同,相应的配置也不相同:

(1)映射到一个或多个Servlet

filter-mapping><filter-name>FilterName</filter-name><servlet-name>ServletName1</servlet-name>
</filter-mapping>
<filter-mapping><filter-name>FilterName</filter-name><servlet-name>ServletName2</servlet-name>
</filter-mapping>

(2)映射到一个或多个JSP:

<filter-mapping><filter-name>FilterName</filter-name><url-pattern>/path/FileName.jsp</url-pattern>
</filter-mapping>

(3)映射到任意的URL:

<filter-mapping><filter-name>FilterName</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

在实际应用中,要特别注意过滤器链的执行顺序问题,web服务器根据过滤器在web.xml文件中的注册顺序,决定先调用哪个过滤器,当第一个过滤器的doFilter方法被调用时,web服务器会创建一个代表过滤器链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

过滤器的简单应用

在【Servlet(2)之简单应用】中,我们介绍了使用Session防止用户非法登录到某个页面,采用的是在登录页面将用户信息放入Session,在需要防止非法登录的页面取出登录的信息,如果没有登录用户的信息,则为非法登录,然后将其强制跳转到登录页面。

那么就出现了一个问题,如果我们的Web应用有很多个需要防止非法登录的页面怎么办?一个个都这样处理肯定非常麻烦。这时候,过滤器的应用就让这个问题变得非常简单。

首先,我们编写CheckUserFilter,它的doFilter()代码如下:

public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)arg0;HttpServletResponse response = (HttpServletResponse)arg1;User login_user = (User)request.getSession().getAttribute("login-user");if(login_user == null){// 说明用户没有登录,让他跳转到错误页面request.setAttribute("error", "请登录!");request.getRequestDispatcher("/LoginServlet").forward(request,response);}else{// 让其通过chain.doFilter(request, response);}
}

可以看到,在doFilter中,我们去判断Session中是否有登录用户的信息,如果有,让其通过;如果没有,则强制跳转到登录页面。然后我们对这个Filter进行部署,假设我们的主页面MainFrame,添加用户的页面AddUser和更新用户的页面UpdateUser都需要防止非法登录,则可以让其映射到所有的这些Servlet上,部署如下:

<filter><filter-name>CheckUserFilter</filter-name><filter-class>com.gavin.filter.CheckUserFilter</filter-class>
</filter><filter-mapping><filter-name>CheckUserFilter</filter-name><servlet-name>MainFrame</servlet-name>
</filter-mapping>
<filter-mapping><filter-name>CheckUserFilter</filter-name><servlet-name>AddUser</servlet-name>
</filter-mapping>
<filter-mapping><filter-name>CheckUserFilter</filter-name><servlet-name>UpdateUser</servlet-name>
</filter-mapping>

实验可得,在没有登录之前去访问MainFrame、AddUser或者UpdateUser,都会提示错误信息,然后跳转到登录页面。


其实过滤器还有更多的知识与细节,比如request、forward、include和error四种过滤器的具体使用方法等。这些知识在这里先不展开,后续用到再补充。


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

相关文章

servlet过滤器的简单使用

为什么要用过滤器或者拦截器&#xff1f; 简单来讲&#xff0c;当一个账户需要进入某个系统调用某个接口时&#xff0c;我们需要对其进行相应验证&#xff0c;否则一旦接口暴露&#xff0c;可能会造成系统崩溃。这个时候我们就需要用拦截器对调用接口一方进行身份验证。 serv…

Servlet过滤器Filter

Servlet Filter 又称 Servlet 过滤器&#xff0c;它是在 Servlet 2.3 规范中定义的&#xff0c;能够对 Servlet 容器传给 Web 资源的 request 对象和 response 对象进行检查和修改。Filter 不是 Servlet&#xff0c;不能直接访问&#xff0c;它本身也不能生成 request 对象和 r…

Servlet之过滤器

问题引入 以往的Servlet中&#xff0c;有冗余代码&#xff0c;多个servlet都要进行编写 概念 过滤器(Filter)是处于客户端于服务器资源之间的一道技术。 图示&#xff1a; 过滤器的作用 执行地位在Servlet之前&#xff0c;客户端发送请求时&#xff0c;会先经过Filter&#xff…

servlet过滤器的介绍

servlet过滤器是服务器与客户端请求与响应的中间层组件&#xff0c;它主要是用于对浏览器的请求进行过滤处理&#xff0c;并将过滤后的请求再转给下一个资源。 servlet过滤器的基本概念 Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求&#xff0c;而…

Servlet——过滤器(fiter)

什么是过滤器&#xff1f; 过滤器是Servlet的一个组件&#xff0c;是设计模式中过滤器模式&#xff08;又叫责任链模式&#xff09;的一种经典实现 是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff…

java基础篇---Servlet过滤器

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

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;其实还有一部分原因是日常留下的“使用痕迹”和自启动的应用程序…