J2EE设计模式浅谈(二)之Filter

【华为OD机试】真题A卷-Linux发行版的数量(Python) 【华为OD机试】真题A卷-Linux发行版的数量(Python):Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。给你一个nxn的矩阵isConnected,其中isConnected[i][i]=1表示第i个发行版和第j个发行版直接 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> J2EE设计模式浅谈(二)之Filter zhaum@studyjava.com 其实J2EE中太多的定义是很烦人的,设计模式也很抽象的,今天我就以Servlet2.3中新增的Filter在Web Application中的应用,来进一步的说明设计模式。 首先假设我们现在想做一个Web Application(例如BBS)。 要求具备下列功能: 1、 在用户发帖子之前,要进行身份认证,以确认该用户是已登陆用户。 2、 其次是要对删除帖子,修改帖子,进行权限检查。 3、 访问特定资源(Web 页、JSP 页)时的身份认证 那么对待这些要求我们该怎么去做,如果在每个页面中都写检查权限的代码,不是一个好想法,且使的程序的可重用性降低,对比设计模式Intercepting Filter(截获过滤)正好符合我们的要求,且在Servlet2.3中通过使用过滤器(Filter)能够使得Web Application开发者能够在请求到达Web资源之前截取请求,在处理请求之后修改应答。 一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法: · init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数(文章的后面有lightningboard 的web.xml文件)。 · doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息,Filter中因为有了 FilterChain,就使的几个FILTER 成了一个链条。 · destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法 在开源的lightningboard BBS中实现了两个Filter,如下 1、ControllerFilter在这里起到的是Front Controller(前端控制器)的作用,是MVC模式中的控制器,是该BBS的入口点。 package lightningboard; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lightningboard.action.*; /** * Control all *.do. * @version 0.3.5 * @author Xiaobo Liu */ public class ControllerFilter implements Filter { /** * Action dispatch
* example: homde.do will be create HomeAction and call its excute() method. */ protected FilterConfig filterConfig; public void init(FilterConfig config) { this.filterConfig = config; } public void destroy() { this.filterConfig = null; } public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException{ HttpServletRequest request = (HttpServletRequest)srequest; HttpServletResponse response = (HttpServletResponse)sresponse; long timeStart=System.currentTimeMillis(); Configuration cfg=Configuration.getInstance(); String encoding=cfg.getValue("SYS.ENCODING"); request.setCharacterEncoding(encoding); String path = (String) request.getRequestURI(); String actionString = path.substring(path.lastIndexOf("/") 1,path.lastIndexOf(".")); String forwardPage=null; try { if(actionString.equals("forum")) forwardPage=new ForumAction().excute(request,response); else if(actionString.equals("topic")) forwardPage=new TopicAction().excute(request,response); else if(actionString.equals("user")) forwardPage=new UserAction().excute(request,response); else if(actionString.equals("userList")) forwardPage=new UserListAction().excute(request,response); else if(actionString.equals("login")) forwardPage=new LoginAction().excute(request,response); else if(actionString.equals("register")) forwardPage=new RegisterAction().excute(request,response); else if(actionString.equals("post")) forwardPage=new PostAction().excute(request,response); else if(actionString.equals("postP")) forwardPage=new PostPAction().excute(request,response); else if(actionString.equals("userEdit")) forwardPage=new UserEditAction().excute(request,response); else if(actionString.equals("userEditP")) forwardPage=new UserEditPAction().excute(request,response); else if(actionString.equals("logout")) forwardPage=new LogoutAction().excute(request,response); else //default: home forwardPage=new HomeAction().excute(request,response); }catch (ActionException ex) { Debug.out(ex); request.setAttribute("actionMessage",new ActionMessage("system_error")); forwardPage="/actionMessage.jsp"; } // forward page if (forwardPage!=null){ String processTime="" (System.currentTimeMillis()-timeStart); request.setAttribute("processTime",processTime); filterConfig.getServletContext().getRequestDispatcher(forwardPage).forward(request,response); } } } 2、此FILTER起的是Intercepting Filter(截获过滤)的作用。 package lightningboard.filter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionAuthorizationFilter implements Filter { protected FilterConfig filterConfig; public void init(FilterConfig config) { this.filterConfig = config; } public void destroy() { this.filterConfig = null; } private boolean passed(ServletRequest request, ServletResponse response) throws IOException, ServletException { boolean result=false; String objectName=this.filterConfig.getInitParameter("OBJECT_NAME"); HttpServletRequest req = (HttpServletRequest)request; HttpSession session =req.getSession(false); if(session!=null){ Object object=session.getAttribute(objectName); if(object!=null) result= true; } return result; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException{ if (passed(request,response)) filterChain.doFilter(request, response); else{ HttpServletResponse res = (HttpServletResponse)response; String errorPage=this.filterConfig.getInitParameter("ERROR_PAGE"); res.sendRedirect(errorPage); } } } 容器通过 Web 应用程序中的配置描述符 web.xml 文件解析过滤器配置信息。有两个新的标记与过滤器相关: 和 。 标记是一个过滤器定义,它必定有一个 和 子元素。 子元素给出了一个与过滤器实例相关的名字。 指定了由容器载入的实现类。您能随意地包含一个 子元素为过滤器实例提供初始化参数。 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。 lightningboard 项目中的web.xml文件如下: controllerFilter lightningboard.ControllerFilter sessionAuthorizationFilter lightningboard.filter.SessionAuthorizationFilter ERROR_PAGE login.jsp OBJECT_NAME loginBean sessionAuthorizationFilter /post.do sessionAuthorizationFilter /postP.do sessionAuthorizationFilter /post.jsp sessionAuthorizationFilter /userEdit.do sessionAuthorizationFilter /userEditP.do sessionAuthorizationFilter /userEdit.jsp sessionAuthorizationFilter /userList.do controllerFilter *.do index.html 由于本人水平有限,不当之处还请指正,谢谢!!!
Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行 阅读详情

相关推荐

Python Selenium调用IE11报错全解析:从环境配置到稳定运行

在Web自动化测试领域,Selenium作为主流的跨浏览器测试框架,其核心原理是通过WebDriver协议与不同浏览器的驱动程序进行通信,实现对浏览器行为的模拟与控制。这一技术为软件测试的自动化、回归测试的效率提升提供了重要价值,广泛应用于金融、政务等对遗留系统兼容性要求高的行业场景。然而,当技术栈涉及过时的浏览器如IE11时,环境配置的复杂性显著增加,特别是Python与Selenium的组合常遭遇驱动兼容性、安全设置等挑战。本文聚焦于解决Python Selenium驱动IE11时的典型报错问题,深入剖

weixin_28834765的博客 324

【J2EE设计模式】拦截过滤器模式

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。 过滤器(Filter) - 过滤器在请求处理程序...

猫巳的博客 502

我每天如何使用 ChatGPT

我偶尔会用这个功能作为开始。我本人非常喜欢阅读,让 ChatGPT 来概括所有文章,感觉就像身处于但丁描述的地狱的某个层次那样痛苦。然而,有时一些文章实在是太啰嗦、无聊,或者写得让人不愉快(比如一个无趣记者对一个让人讨厌的人进行的漫无焦点的采访)。我需要获取这些文章中的一些信息,以便保持信息的更新和了解。在晚期资本主义的广告经济下,很多文章只在一个段落里提供新信息,其余都是无聊的填充内容,只是为了展示糟糕的广告,这实在是对人们的时间和生命的一种浪费。我有几次利用 ChatGPT 来。

KevinDai007的博客 3786

理解J2EE中的filter,interceptor 之 责任链设计模式(ChainOfResponsibility)

Arisan_code的专栏 779

龙芯3A5000开发板PMON升级UEFI固件实战指南

固件是计算机硬件与操作系统之间的关键桥梁,负责初始化硬件并引导系统启动。其工作原理是在上电后执行自检、加载引导程序,最终将控制权移交操作系统。在国产化平台中,采用标准化的UEFI固件具有重要技术价值,它能提供图形化配置界面、统一硬件驱动模型,并支持安全启动等现代特性,从而显著提升硬件兼容性与系统管理效率。这一技术广泛应用于PC、服务器及嵌入式设备,尤其在需要运行银河麒麟等主流操作系统的龙芯开发板场景中,将传统PMON固件升级至UEFI,能实现更流畅的系统安装与更稳定的运行体验。本文基于固件升级与UEFI引导

weixin_42664597的博客 563

目标检测之Mask R-CNN(Pytorch):小白动手实现项目

目标检测之Mask R-CNN:小白动手实现项目Pytorch引言Mask R-CNN原理简述代码、注释及详细解释 引言 首先声明本项目的运行环境。操作系统为Windows,编写环境为Anaconda3 + Jupyter Notebook。Pytorch版本为 torch 1.7.1+cu110 、torchvision版本为 0.8.2+cu110,cuda版本为cu100,显卡为Nvidia 2060。 我是目标检测领域的小白,刚刚完成了Pytorch的相关入门学习任务,所以我认为学习本篇博客的基础

dzc_go的博客 1万+

Filter学习2

Servlet2.3 Filter   1、Servlet Filter概述   凡是开发过J2EE的web application的人员都知道,经常需要处理以下几种情况:    访问特定资源(Web 页、JSP 页、servlet)时的身份认证    应用程序级的访问资源的审核和记录    应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上    对被访问资源的及时转换, ...

lj_honeybee的专栏 338

【AUTOSAR-DEM】-2.1-APP SWC设置UDS/OBD DTC检出和恢复

点击返回「《Autosar_BSW高阶配置》总目录」 案例背景(共6页精讲): DEM模块提供两种不同类型的Event: • BSW-related events:DEM_EVENT_KIND_BSW(通过C-API报告 - Dem_SetEventStatus) • SW-C-related events:DEM_EVENT_KIND_SWC(通过RTE operation - SetEventStatus) 下面我们讲讲在APP SWC中设置BusOff(总线关闭) DTC故障成立/恢复(其它

「汽车电子助手」的博客 3945

J2EE  设计模式

1 2.1. 表示层 模式 2.1.1. Intercepting Filter — 拦截过滤器 模式 Context The presentation-tier request handling mechanism receives many different types of requests, which require varied types of processing. So...

bobo的博客 532

【如何学习CAN总线测试】——AUTOSAR网络管理自动化测试(CAPL源码)

上一章介绍的是AUTOSAR网络管理如何测试、用例设计,对于不满足手工测试的同学,本章就介绍AUTOSAR网络管理自动化测试。

测试领域技术分享 6239

手把手教你学PCIE(2.1.8)--pcie基本概念流量控制(Flow Control, FC)

PCIe 的流量控制(Flow Control, FC)是确保数据传输可靠性和高效性的关键技术。通过信用值管理,发送方和接收方可以动态调整数据传输速率,避免数据丢失和溢出。理解流量控制的工作原理和实现机制对于开发和调试 PCIe 系统非常重要。希望这个介绍能帮助你更好地理解和使用 PCIe 流量控制。

MHD0815的博客 1808

J2EE设计模式浅谈(一)

J2EE设计模式浅谈(一)

futurerock的专栏 541

MinerU 系列教程 | 第二课:快速上手 -- 安装与第一次解析

本篇教程作为的第二课,将带你从零完成 MinerU 的环境搭建、模型下载,并成功运行第一次文档解析。上一课我们从宏观视角认识了 MinerU,本课开始正式动手实践。

weixin_43674738的博客 304

J2EE开发建类dao,modal,service,impl,util包通常是什么意思,什么功能的类放在其下

dao 与数据库的操作,增删改查等方法modal 一般都是javabean对象,例如与数据库的某个表相关联。service 供外部调用,等于对dao,modal等进行了包装。impl 定义的接口util 通常都是工具类,如字符串处理、日期处理等   --- DAO : data access object 与数据库交互的相关JAVA代码写在这,比如对DATABASE的增删改查;

海阔天空 2871

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 339

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 27

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 232

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 310

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 120

设计模式之策略模式

策略模式是一种行为型设计模式,将可互换的算法封装为独立策略,使客户端可在运行时动态选择并切换算法。核心由策略接口、具体策略和上下文三部分组成。通过将算法与使用分离,实现解耦与灵活扩展。适用于多算法场景,如支付方式、排序策略等,避免冗长的if/else。

FallingGod的博客 417

设计模式指南 (Java 版)

设计模式是解决软件设计中常见问题的可复用方案,而非直接代码。本文以最简方式梳理三大类设计模式:创建型(如单例、工厂方法)、结构型(如适配器、装饰器)和行为型(如观察者、策略)。通过生活化类比与Java示例,强调“按需使用、避免过度设计”的原则,帮助理解其核心思想与实际应用。

sync_with_U 253

Vue3 组合式函数(Composables)设计模式:从封装到复用

本文以一次因复制粘贴导致的全局状态污染事故为引,深入剖析 Vue 3 Composable 的三大陷阱:单例状态误用、生命周期钩子注册失效与异步请求竞态。作者通过重构实践,强调 Composable 复用的核心是“带生命周期的响应式上下文”,而非简单代码复用。提出关键规范:状态归属决定 ref 位置、钩子必须在 setup 同步执行、用序号或 AbortController 解决竞态,并倡导基于“状态与生命周期”判断抽取时机,最终提升代码健壮性与团队协作效率。

滴水成河,汇流成海 171

【第四部分:Agentic 智能体设计模式】18.Agent 并行化实战:任务拆分、并发执行与结果汇总

本文介绍 Parallelization(并行化模式)的原理与工程实现,重点分析 Fan-out / Fan-in、Sectioning、Voting、任务依赖、上下文隔离、并发控制及部分失败处理。结合采购合同并行分析案例与 Java CompletableFuture 代码,说明如何实现独立任务的并发执行、结构化结果汇总和证据校验。同时介绍 LangGraph 动态任务分发、OpenAI 并行 Subagent、LangChain 异步 Subagent 及 DeepSeek Super-agent 等近

weixin_42258782的博客 254

设计模式之访问者模式

访问者模式是一种行为型设计模式,核心思想是将操作从元素类中分离,通过“访问者”统一管理对对象结构的多种操作。适用于元素类型稳定但操作频繁变化的场景。其精髓在于双重分派:元素通过accept方法触发访问者visit,最终由元素和访问者的运行时类型共同决定具体执行逻辑。该模式避免了在元素类中添加大量方法,提升扩展性,但会增加类数量与复杂度。典型应用如编译器语法树遍历、报表统计等。

FallingGod的博客 130

设计模式与生活⑭:一栋楼,共用一份热

今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。

工一木子 372
上一篇: J2SE 1.5 in a Nutshell 中文版
下一篇: 为jive论坛加上投票功能
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值