servlet——三兄弟的另外两个:过滤器/监听器

过滤器

我们写多了servlet会发现,很多代码和功能是重复的,比如:解决中文乱码问题、权限验证、日志的记录等,他们的特点是:代码相同或相似、分散在不同位置、不利于维护。

过滤器就是他们的解决办法。

过滤器是请求到达目标之前的处理程序,也是响应离开服务器之前的处理程序。

我们可以定义多个过滤器来组成一个过滤器链,每个过滤器完成一个任务,请求和响应如图所示,依次经过过滤器,第一个过滤器最先被经过,离开时最后被经过。

这种设计使用了一个设计模式:责任链模式。

一个图秒懂

如图,功能类似的代码只有一份,便于维护。

我们如何使用过滤器呢?

1)开发过滤器类

2)指定过滤器过滤范围(有些请求不需要经过某些过滤器)

一共也就两个方法,非常简单,我们写一个解决中文乱码的过滤器吧:

public class EncodingFilter implements Filter{private String encoding;/*** 初始化操作,只执行一次*/@Overridepublic void init(FilterConfig config) throws ServletException {//先读取配置文件,获取编码类型encoding = config.getInitParameter("encoding");if(encoding == null){encoding = "utf-8";}}/*** 相当于Servlet的service(),过滤范围的每次请求响应都经过*/@Overridepublic void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException {//请求到达目标资源之前的预处理操作request.setCharacterEncoding(encoding);//调用下一个过滤器或者目标资源chain.doFilter(request, response);//响应离开服务器端之前的后处理操作(无)}/*** 销毁操作,只执行一次*/@Overridepublic void destroy() {// TODO Auto-generated method stub}}

相关配置也和servlet类似(通过kv找到utf-8):

       <filter><filter-name>EncodingFilter</filter-name><filter-class>com.bjsxt.filter.EncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping>

我们再理解一下过滤器的执行过程:

代码中:

               //请求到达目标资源之前的预处理操作
            
               //调用下一个过滤器或者目标资源

               //响应离开服务器端之前的后处理操作(无)

一共有这么三个操作,而过滤器的执行过程就是如此的

化的很丑但是就是这个意思。

再写一下怎么搞过滤范围,也超简单直接上代码了:
 

public class AuthFilter implements Filter{@Overridepublic void init(FilterConfig filterconfig) throws ServletException {// TODO Auto-generated method stub}/*** 过滤路径是  /servlet/*  *.jsp* 某些jsp应该排除在外   * 某些servlet应该排除在外*/@Overridepublic void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httprequest = (HttpServletRequest)request;             String uri = httprequest.getRequestURI();int n1 =  uri.indexOf("login.jsp");//   >=0 存在int n2 =  uri.indexOf("register.jsp");int n3 = uri.indexOf("index.jsp");int n4 = -1;int n5 = -1;if(n1>=0 || n2>=0 ||n3>=0 ||n4>=0 ||n5>=0 ){ //假设是需要排除在外的资源//放行chain.doFilter(request, response);}else{//do something}}@Overridepublic void destroy() {// TODO Auto-generated method stub}
}

监听器

监听器是一个实现特定接口的普通Java程序,这个程序专门用于监听另一个Java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行

超简单代码例子:

package listener;import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
/**
* 记录每个请求的时间,客户端IP,URL地址到日志文件中
* @author Administrator
*
*/
public class LogListener implements ServletRequestListener,ServletRequestAttributeListener{/*** 请求结束了*/@Overridepublic void requestDestroyed(ServletRequestEvent servletrequestevent) {// TODO Auto-generated method stub}/*** 请求开始了* 其实对于图片、视频、音频、js、css也会有一个新的请求,所以也会被监听*/@Overridepublic void requestInitialized(ServletRequestEvent sre) {//获取要记录的每个请求的时间,客户端IP,URL地址Date now = new Date();HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();String addr = request.getRemoteAddr();String url = request.getRequestURL().toString(); //http://127.0.0.1:8081/myservlet/servlet/UserServletString qs = request.getQueryString();  //method=login//记录到日志文件中PrintWriter pw = null;try {pw = new PrintWriter(new FileWriter("d:/requestlog.log", true));  //if(qs!= null){pw.println("time="+now.toLocaleString()+",addr="+addr+",url="+url+"?"+qs);}else{pw.println("time="+now.toLocaleString()+",addr="+addr+",url="+url);}                        } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{pw.close();}}/*** request.setAttribute("error","用户名不能为空");**/@Overridepublic void attributeAdded(ServletRequestAttributeEvent servletrequestattributeevent) {// TODO Auto-generated method stub}/**** request.removeAttribute("error");*/@Overridepublic void attributeRemoved(ServletRequestAttributeEvent servletrequestattributeevent) {// TODO Auto-generated method stub}/*** request.setAttribute("error","用户名和密码错误");*/@Overridepublic void attributeReplaced(ServletRequestAttributeEvent servletrequestattributeevent) {// TODO Auto-generated method stub}}<listener><listener-class>listener.LogListener</listener-class></listener>

 

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

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

相关文章

kaggle(05)---Event Recommendation Engine Challenge(基础版)

文章目录目录1.比赛相关介绍1.1 比赛介绍1.2 数据集介绍1.3 评价标准介绍1.4 个人理解2. 解决方案2.1 统计用户和event信息2.2 计算用户相似度2.3 用户社交关系信息处理2.4 构建event和event相似度数据2.5 活跃度/event热度数据2.6 构建特征2.7 模型构建和预测3. 遇到的问题4. …

Python(2)-第一个python程序、执行python程序三种方式

第一个Python 程序1. 第一个Python 程序2. 常用两Python个版本3. 程序执行的三种方式3.1 解释器3.2 交互式运行Python程序3.3 IDE&#xff08;集成开发环境&#xff09;-pycharm1. 第一个Python 程序 Python 源程序就是一个特殊格式的文本文件&#xff0c;所以可以采用任意的文…

推荐算法---FM,协同过滤

文章目录目录1.FM算法产生背景2.FM算法模型3.FM算法VS其他算法4.推荐算法总结目录 1.FM算法产生背景 在传统的线性模型如LR中&#xff0c;每个特征都是独立的&#xff0c;如果需要考虑特征与特征直接的交互作用&#xff0c;可能需要人工对特征进行交叉组合&#xff1b;非线性…

借助桶排序思想完成的一道题

问题&#xff1a; 数组排序之后的相邻数的最大差值&#xff1b; 嗯&#xff0c;你可以排序&#xff0c;然后找相邻的最大差值。 但是你觉得这么简单我写他干啥。 最优解&#xff1a;时间复杂度O(N)&#xff0c;空间O(1) 那我们开始说这种方法&#xff1a; 1&#xff09;遍…

Python(3)-Pycharm基本使用技巧

初识Pycharm1.界面2.恢复初始设置3.第一次打开Pycharm4.打开一个项目5.设置解释器的版本。6.新建项目7.编辑器、控制台的字体设置Pycharm–适合于开发管理大型项目&#xff0c;项目是用以解决复杂功能的软件。1.界面 导航区–主要有什么文件 编辑区–编辑具体的文件 控制台窗口…

推荐算法概述(01)

1.什么是推荐系统 用户没有明确的需求&#xff0c;你需要的是一个自动化的工具&#xff0c;它可以分析你的历史兴趣&#xff0c;从庞大的电影库中找到几部符合你兴趣的电影供你选择。这个工具就是个性化推荐系统。 推荐系统的主要任务 推荐系统的任务就是联系用户和信息&…

何为布隆过滤器

问题的提出 我们有一个不安全网页的黑名单&#xff0c;包含了100亿个黑名单网页的URL,每个网页URL最多占用64B.。 现在我们要设计一个网页过滤系统&#xff0c;这个系统要判断该网页是否在黑名单里&#xff0c;但是我们的空间有限&#xff0c;只有30GB. 允许有万分之一的判断…

推荐算法--利用用户行为数据(02)

文章目录目录1.什么是用户行为数据&#xff1f;1.1用户行为分类2.用户行为数据如何使用&#xff1f;2.1 用户活跃度和物品流行度的分布2.2 用户活跃度和物品流行度的关系2.3 协同过滤算法3.实验设计和算法评测4.基于邻域的的推荐算法4.1 基于用户的协同过滤算法4.2 基于物品的协…

《Head First设计模式》第九章(2)组合模式

组合模式 ​ 基于前一篇迭代模式的案例进行需求更新&#xff0c;餐厅的菜单管理系统需要有煎饼屋菜单和披萨菜单。现在希望在披萨菜单中能够加上一份餐后甜点的子菜单。 在迭代模式中&#xff0c;披萨菜单是用数组维护的&#xff0c;我们需要让披萨菜单持有一份子菜单&#xf…

Python(4)--Pycharm安装、使用小技巧

Pycharm安装1.专业版Pycharm 安装2.设置Pycharm桌面快捷图标3.Linux卸载一个软件4.教育版Pycharm的安装5.多文件项目演练&#xff08;Pycharm针对学生和教师开发了免费使用版&#xff09;1.专业版Pycharm 安装 1.官网下载安装包 .tar.gz 2.解压缩 tar -zxvf 文件名 3.移动解压…

推荐算法--推荐系统冷启动问题(03)

文章目录目录1.什么是冷启动问题&#xff1f;1.1冷启动问题1.2 冷启动问题的分类1. 用户冷启动2 物品冷启动3 系统冷启动2.如何解决冷启动问题&#xff1f;2.1利用用户注册信息2.2选择合适的物品启动用户的兴趣2.3利用物品的内容信息2.4 发挥专家的作用目录 1.什么是冷启动问题…

《Head First 设计模式》第十章-状态模式 状态模式

状态模式 策略模式和状态模式是双胞胎&#xff0c;在出生时才分开。你已经知道&#xff0c;策略模式是围绕可以互换的算法来创建成功业务的&#xff0c;然而&#xff0c;状态走的是更崇高的路&#xff0c;它通过改变对象内部的状态来帮助对象控制自己的行为。 定义状态模式 …

推荐算法--利用用户标签数据(04)

文章目录流行的推荐系统通过3种方式联系用户兴趣和物品 &#xff08;1&#xff09;&#xff1a;利用用户喜欢过的物品&#xff0c;给用户推荐与他喜欢过的物品相似的物品&#xff0c;这是基于物品的算法。 &#xff08;2&#xff09;&#xff1a;利用和用户兴趣相似的其他用户…

Python(5)-注释

Python注释1.单行注释2. 多行注释&#xff08;块注释&#xff09;3.注释的使用和代码规范pyhton 的注释 使用自己熟悉的语言&#xff08;中文&#xff09;&#xff0c;解释代码。Python解释器在执行文件时不会执行井号右边边的内容。1.单行注释 # 井号后面跟着注释内容 灰灰的虚…

网络原理知识点总结

第一章&#xff1a; 计算机网络系统由资源子网和通信子网组成。 计算机网络系统主要由网络通信系统、操作系统和应用系统构成 互联网基础结构发展的三个阶段&#xff1a; 第一阶段&#xff1a;从单个网络 ARPANET 向互联网发展的过程。 第二阶段&#xff1a;建成了三级结构…

推荐算法--时效性(05)

时效性 推荐系统应该考虑时间效应&#xff0c;因为用户的兴趣是有时间变化的。用户一年前喜欢的东西现在不一定感兴趣&#xff0c;相比于推荐过去喜欢的物品&#xff0c;推荐用户近期喜欢的物品更有参考价值。而在新闻更是如此&#xff0c;推荐过去跟用户兴趣一致的新闻已经失去…

推荐算法--推荐系统架构(06)

外围架构一般来说&#xff0c;每个网站都有一个 UI 系统&#xff0c;UI 系统负责给用户展示网页并和用户交互。网站会通过日志系统将用户在 UI 上的各种各样的行为记录到用户行为日志中。 从上面的结构可以看到&#xff0c;除了推荐系统本身&#xff0c;主要还依赖两个条件--界…

Python(6)-算数运算符

算数运算符1.算数运算符2.优先级1.算数运算符 加 减- 乘* 除/ 取商// 取余数% 幂**(能算n次方&#xff1a; 2**38&#xff0c;一直以为只能算平方) 扩展&#xff1a; 乘法用于字符串&#xff1a;字符串重复指定的次数&#xff0c;要拼接的次数很长时&#xff0c;用乘号很方便…

推荐算法--其他信息(07)

文章目录目录1.利用上下文信息1.1时间上下文1.2地点上下文2.利用网络社交数据2.1 获取网络社交数据途径2.2 社交网络数据2.3 基于社交网络的推荐2.4 推荐算法2.5 给用户推荐好友目录 1.利用上下文信息 1.1时间上下文 用户的兴趣是随着时间变化的&#xff0c;三天打鱼两天晒网…

Python(7)-程序执行的原理

程序执行的原理1.计算机中的三个核心部件2.程序执行的原理3.程序的作用1.计算机中的三个核心部件 CPU&#xff1a;中央处理区&#xff0c;超大规模的集成电路&#xff0c;负责处理数据、计算 内存&#xff1a;临时存储数据&#xff0c;断电数据消失&#xff0c;读取数据快 硬盘…