ch9.3 过滤器和监听器

Logback日志脱敏实战:从原理到实现,构建安全防线 日志是应用监控与调试的核心组件,记录了系统运行的关键信息。然而,日志中常包含用户手机号、身份证号等敏感数据,若直接明文输出,会带来严重的数据泄露风险。从技术原理看,日志脱敏通过在日志输出流水线中插入处理环节,对敏感信息进行掩码替换,实现数据安全与合规要求。其技术价值在于以非侵入方式保障数据安全,避免业务代码污染,提升系统可维护性。在应用场景上,无论是金融交易、用户注册还是订单处理,日志脱敏都是数据安全防线的关键一环。本文聚焦于Logback框架,详细解析如何通过自定义Layout组件,结合正则表达式与预编译 阅读详情

Servlet分为三种:

  • 简单Servlet: 作为以一种程序所必须的开发结构保存下来
  • 过滤Servlet:
  • 监听Servlet:这两个都是以组建的形式出现的,是额外附加的。

过滤器

之前的Servlet采用继承HttpServlet类的形式完成, 过滤器则使用接口。
如果要用过滤器开发,则首先必须让一个类实现Filter接口

javax.servlet 
Interface Filter

根据此包的特点发现,此接口的功能是完成公用协议操作的。

过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器采用了链的方式进行处理。


过滤器在开发中使用最频繁的两种操作:
  • 编码过滤
  • 登录验证


监听器

WEB中的监听主要是对ServletContext, Session, Request进行监听的操作



对Application进行监听

对application监听,实际上就是对ServletContext(Servlet上下文)监听。主要使用

javax.servlet 
Interface ServletContextListener :
对整个上下文环境的监控


其中 javax.servlet的   Class ServletContextEvent中定义了一个方法:
public ServletContext getServletContext() 取得application对象


javax.servlet 
Interface ServletContextAttributeListener:对属性的监听



事件 ServletContextAttributeEvent中有两种方法getName()和getValue()。

监听器就是实现接口覆写方法。


web.xml文件配置中:
  • 简单Servlet :<servlet> <servlet-mapping>
  • 过滤器: <filter> <filter-mapping>
  • 监听器:<listener>
如果一个web.xml中这三种都包含,则按一下顺序配置:
  1. 先配置过滤器:<filter> <filter-mapping>
  2. 在配置监听器:<listener>
  3. 最后配置简单Servlet: <servlet> <servlet-mapping>

对session监听

对session监听有三个接口:在 javax.servlet.http  包中
HttpSessionListener   :对创建和销毁session的操作进行监听
Method Summary
  voidsessionCreated(HttpSessionEvent se) 
          Receives notification that a session has been created.
 voidsessionDestroyed(HttpSessionEvent se) 
          Receives notification that a session is about to be invalidated.
session销毁有两种方法:
  • session注销 invalidate()
  • 超时时间到了,超时时间30分钟
HttpSessionAttributeListener  对session的属性监听
Method Summary
 voidattributeAdded(HttpSessionBindingEvent event) 
          Receives notification that an attribute has been added to a session.
 voidattributeRemoved(HttpSessionBindingEvent event) 
          Receives notification that an attribute has been removed from a session.
 voidattributeReplaced(HttpSessionBindingEvent event) 
          Receives notification that an attribute has been replaced in a session.


HttpSessionBindingListener  这个监听可以不用配置直接使用

Method Summary
 voidvalueBound(HttpSessionBindingEvent event) 
          Notifies the object that it is being bound to a session and identifies the session.
 voidvalueUnbound(HttpSessionBindingEvent event) 
          Notifies the object that it is being unbound from a session and identifies the session.

对Request监听:

主要使用 ServletRequestListener  对请求监听和ServletRequestAttributeListener 对属性监听 两个接口。这两个接口在javax.servlet.http.*中。但是不常用

监听器实例:在线人员统计
用户在登陆之后,会在在线人员列表中增加此用户名称,这样就可以统计在线用户人数了。




直接在之前的 登陆页面中加入如下代码:
OnlineUserList.java
<pre name="code" class="java">package org.thystar.listenerdemo;

import java.util.Set;
import java.util.TreeSet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineUserList implements HttpSessionAttributeListener,
		HttpSessionListener, ServletContextListener {

	private ServletContext app = null; // 用于application属性的操作
	public void contextInitialized(ServletContextEvent sce){    //上下文初始化
		this.app = sce.getServletContext();           // 取得ServletContext实例
		this.app.setAttribute("online",new TreeSet()); //设置空集合
	}
	public void attributeAdded(HttpSessionBindingEvent event){   //增加session属性
		Set<Object> all = (Set)this.app.getAttribute("online"); //取出已有列表
		all.add(event.getValue()); // 增加新用户
		this.app.setAttribute("online", all); //重新保存
	}
	public void attributeRemoved(HttpSessionBindingEvent event){ 
		Set all = (Set)this.app.getAttribute("online");  // 取出已有列表
		all.remove(event.getValue());          //删除离开用户
		this.app.setAttribute("online", all); // 重新保存
	}
	public void sessionDestroyed(HttpSessionEvent event){  
		Set all = (Set)this.app.getAttribute("online");
		all.remove(event.getSession().getAttribute("userid"));  //取出设置的内容
		this.app.setAttribute("online", all);
	}
 	public void sessionCreated(HttpSessionEvent event){
	}
	public void attributeReplaced(HttpSessionBindingEvent event){
	}
	public void contextDestroyed(ServletContextEvent sce){
	}
}
 在web.xml中添加代码:
<listener>
  	<listener-class>org.thystar.listenerdemo.OnlineUserList</listener-class>
  </listener>


修改登陆页面login.jsp;
<%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%>

<html>
  <head>
    
    <title>www.thystar.com</title>
    <script language = "JavaScript">
    
    	function validate(f){
    		if(!(/^\w{1,15}$/.test(f.userid.value))){
    			alert("用户ID必须是1~15位");
    			f.userid.focus();
    			return false;
    		}
    		if(!(/^\w{1,15}$/.test(f.userpass.value))){
    			alert("密码必须是1~15位");
    			f.userpass.focus();
    			return false;
    		}
    		return true;
    	}
    </script>

  </head>
  
  <body>
    <h2>用户登录</h2>
     <%
    	request.setCharacterEncoding("GBK");
     %>
     <%
     	List<String> info=(List<String>)request.getAttribute("info");
     	if(info != null){
     		Iterator<String> iter = info.iterator();
     		while(iter.hasNext()){
     %>
     			<h4><%= iter.next() %></h4>
     <%
     		}
     	}
     %>
     <form action="LoginServlet" method="post" onSubmit = "validate(this)">
     
     	用户ID: <input type = "text" name = "userid"><br>
     	密  码:<input type = "password" name="userpass"><br>
     	<input type = "submit" value = "登录">
     	<input type = "reset" value = "重置">
     </form>
     <%
     	String userid = request.getParameter("userid");
     	if(!(userid == null || "".equals(userid))){
     		session.setAttribute("userid", userid);
     		response.sendRedirect("list.jsp");
     	}
      %>
  </body>
</html>

最后,给出list.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<html>
  <head>
    <title>My JSP 'list.jsp' starting page</title>
  </head>
  
  <body>
    <h2>在线用户列表</h2>
    <%
    	Set all = (Set)this.getServletContext().getAttribute("online");
    	Iterator iter = all.iterator();
    	while(iter.hasNext()){
    %>
    		<h2><%=iter.next() %>,</h2>
    <% 
    	}
    %>
  </body>
</html>

数据库中的信息:


打开登陆页,登陆后再重新打开一个浏览器重复操作,结果如下:



Kali Linux渗透测试实战:10大高频场景从入门到精通 渗透测试是评估网络安全性的核心方法,其原理在于模拟攻击者视角,通过系统化的信息收集、漏洞探测与利用,来识别和验证潜在的安全风险。这项技术的价值在于能够主动发现防御体系的薄弱环节,从而在真实攻击发生前进行加固。在应用场景上,它广泛服务于企业安全评估、合规审计、攻防演练及CTF竞赛等领域。无论是针对Web应用、网络服务还是无线网络,掌握一套标准化的实战流程都至关重要。本文聚焦于Kali Linux这一渗透测试标准平台,通过精心设计的十大高频实战场景,系统性地串联起从外围侦察、漏洞利用到横向移动的完整攻击链。读者 阅读详情

相关推荐

SpringBoot应用数据加密实战:从存储、传输到展示的全链路安全方案

数据加密是保障应用安全的核心技术之一,其核心原理在于通过特定算法将明文信息转换为不可读的密文,防止未授权访问。在Java生态中,SpringBoot框架因其便捷性被广泛用于构建企业级应用,而Jasypt作为成熟的Java加密库,提供了与SpringBoot无缝集成的能力,能有效对配置文件中的敏感信息进行加密。从技术价值看,合理的数据加密策略不仅能满足等保合规要求,更能构建纵深防御体系,保护用户隐私和商业数据。在实际应用场景中,数据安全需覆盖其完整生命周期:在存储层,可通过MyBatis-Plus插件实现数据

weixin_30905133的博客 380

java 解析web.xml_java web 项目中web.xml 详解

web.xml详述:web.xml 是每个Java web 项目的必备文件,又叫做部署描述符,Servlet规范中定义的,是web应用的配置文件。概念:、部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部...

weixin_29483853的博客 393

SecureCRT 9.0最新版安装与激活全攻略(附驱动识别技巧)

本文提供SecureCRT 9.0最新版的详细安装与激活指南,并重点解析了嵌入式开发中串口连接的硬件驱动识别技巧。内容涵盖从安全获取软件、解决USB转串口驱动兼容性问题,到配置SSH与串口会话的完整流程,旨在帮助开发者和工程师高效部署并精通使用这款终端仿真利器。

star的博客 409

JavaWeb重点内容详解

超文本传输协议 80https:安全的 443sun公司开发动态web的一门技术API中提供的一个接口,编写类,实现servlet接口java类部署到web服务器中实现了servlet接口的java程序叫servlet写JSP如同写HTML区别:HTML静态JSP含JAVA代码,提供动态页面。

qq435322119的博客 295

Kettle Web版部署指南

看到以上的日志则表示启动成功。

2401_89221867的博客 1717

GNSS接收机性能测试全攻略:从实验室到真实场景

本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。

weixin_28365523的博客 515

Java Web开发入门:环境搭建与Servlet实战

Java Web开发是企业级应用的核心技术之一,基于Servlet规范的请求-响应模型构成了动态网页的基础原理。通过配置JDK、Maven和IDE工具链,开发者可以快速构建可维护的项目结构。Servlet作为处理HTTP请求的最小单元,其生命周期管理和会话机制(Session/Cookie)是理解Web交互的关键。在企业实践中,结合Tomcat服务器部署和Logback日志系统,能够有效提升开发效率并快速定位问题。本文以环境配置和首个Servlet程序为例,演示如何避开常见陷阱,为后续Spring等框架学习

weixin_34354945的博客 370

密码学小白必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学初学者提供了系统获取和阅读三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文的实战指南。详细介绍了通过IACR官方渠道、ePrint预印本等权威资源免费下载论文的方法,并分享了高效筛选、精读核心章节及构建个人知识体系的具体策略,帮助读者快速切入密码学研究前沿。

weixin_28363123的博客 394

SSM框架新闻管理系统实战:从架构设计到部署优化

在Java Web开发领域,SSM(Spring + Spring MVC + MyBatis)框架组合是理解企业级应用架构的经典基石。其核心原理在于通过Spring的IoC(控制反转)容器管理对象生命周期,利用AOP(面向切面编程)处理横切关注点,并结合Spring MVC的MVC模式处理Web请求,以及MyBatis作为半自动化ORM实现数据持久化。这种组合的技术价值在于,它让开发者能够深入理解框架底层的工作机制,为后续掌握Spring Boot等高级框架打下坚实基础。在典型的应用场景中,如内容管理系统

chulilang8944的博客 334

从Canny到深度学习:边缘检测指标进化史(含ODS/OIS/AP的数学推导)

本文系统梳理了边缘检测评估指标的演进历程,从经典的Canny算子到深度学习时代,重点解析了ODS、OIS和AP三大核心指标的设计哲学与数学推导。文章深入探讨了基于PR曲线的评估体系,揭示了不同指标(如ODS与OIS)在阈值优化上的差异,并分析了AP指标在边缘检测任务中的优势与局限,为算法研究和模型评估提供了实用指南。

b9c0d的博客 199

手把手教你学simulink实例:基于Simulink的风力发电系统建模与仿真

风力发电作为一种清洁、可再生的能源形式,近年来得到了快速发展。风力发电系统的性能优化和控制策略设计对于提高发电效率、降低运行成本具有重要意义。本项目旨在使用MATLAB/Simulink平台,对风力发电系统进行建模与仿真,研究其动态特性,并验证控制策略的有效性。通过建立风力发电机、传动系统、发电机及电力电子变换器等子系统的模型,实现对风力发电系统的全面分析。

MHD0815的博客 558

Kali Linux渗透测试入门:10个核心工具实战指南与工作流解析

渗透测试是信息安全领域评估系统安全性的核心方法,其原理在于模拟攻击者行为,发现潜在漏洞。通过自动化工具与手动测试结合,渗透测试能够验证安全防御的有效性,广泛应用于企业安全评估、合规审计等场景。在Kali Linux等专业平台中,工具链的协同使用尤为关键,例如Nmap进行网络发现后,可利用Metasploit框架进行漏洞利用,再通过Wireshark分析流量,形成完整测试闭环。本文聚焦Kali Linux中最实用的10款工具,涵盖信息收集、漏洞扫描、密码破解等环节,通过实战案例演示如何将Nmap、Metasp

weixin_34049948的博客 432

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

基于SSM框架的Java Web博客系统开发实战:从环境搭建到部署上线

在Java Web开发领域,SSM(Spring、Spring MVC、MyBatis)框架整合是构建企业级应用的核心技术栈。其原理是通过Spring的IoC容器管理对象生命周期,Spring MVC处理Web请求分发,MyBatis实现数据持久化,三者协同工作形成分层架构。掌握SSM框架对于理解MVC设计模式、数据库交互和Web工程化开发具有重要价值,广泛应用于内容管理系统、电商平台等场景。本文聚焦于一个综合性实践案例——个人博客与多媒体分享平台,详细拆解了从Maven项目骨架搭建、数据库设计、SSM配置

weixin_30896825的博客 413

Xilinx高级调试方法--远程调试

本文主要介绍Xilinx的一些高级调试方法,以及如何使用Xilinx的相关IP。

斌赋的博客 3308

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于SSM框架的校园车辆管理系统设计与实现:Java Web毕业设计实战指南

在Java Web开发领域,SSM(Spring、Spring MVC、MyBatis)框架组合是构建企业级应用的主流技术栈,其核心价值在于通过清晰的MVC分层架构实现业务逻辑的解耦与高效数据交互。Spring框架的IoC容器和AOP机制管理对象生命周期与横切关注点,MyBatis则简化了数据库操作,通过动态SQL实现灵活的数据持久化。这种技术组合特别适用于需要快速开发、易于维护的管理系统,例如校园车辆管理系统。该系统通过车牌识别、自动化计费与数据可视化,解决了传统车辆管理中的效率低下与信息孤岛问题。本文以

weixin_33898876的博客 383

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于SSM框架的景区信息管理系统开发实战与毕业设计指南

SSM框架是Java Web开发中经典的轻量级组合,它通过Spring的IoC容器管理对象依赖、Spring MVC处理Web请求、MyBatis简化数据库操作,共同构建了分层清晰、易于维护的企业级应用架构。这种架构模式在需要快速迭代、数据驱动的中小型项目中极具技术价值,广泛应用于电商、OA、CRM及各类信息管理系统。本文以景区信息管理系统这一典型应用场景为例,深入剖析如何将SSM框架整合应用于实际业务开发,并重点解决环境配置、框架整合、数据库设计等常见痛点。通过结合用户管理、票务预订等核心模块的实现,为开

weixin_30455023的博客 388

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DAO设计模式简介

DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。 数据开发结构: 资源层是数据库的操作层,里面可以进行各种数据库的存储,但是这些数据存储的时候肯定是依靠SQL语句,数据层通过一个专门的数据库组件完成对数据库的操作 业务层是整个项目的核心 DAO组成 DatabaseConnection:

thystar的专栏 7547

Web简介

静态web 最早的Web以静态web形式出现

thystar的专栏 1285

ch5 JSP基础语法--page指令

http://write.blog.csdn.net/postedit Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。 Page指令的语法格式: 页面的MINE page指令中,如果想让JSP文件显示中文,则必须对整个页面指定MIME编码 在页面前加上: 这两种方式的区别: pageEncoding指的是JSP文

thystar的专栏 854

ch9.2 Web开发模式

在web开发中,有两种主要的开发结构:Model I 和Model II,Model II最为重要 Model I Model1就是指开发中将显示层,控制层,数据层的操作交给JSP或者是JavaBean来进行处理: 客户端通过访问的JSP,调用到里面的JavaBean,而通过JavaBean调用数据库。 在JavaBean中就包含了有专门负责处理数据的操作,数据里主要以DAO为主,

thystar的专栏 715

ch2.HTML,javascript简介-- HTML

1. 服务器与浏览器

thystar的专栏 662

ch6.JSP内置对象--session对象

session对象 session对象是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。 session对象用来跟踪在各个客户端请求间的会话。 主要方法: 每个用户都是一个不同的session,服务器通过session id区分不同的用户,用

thystar的专栏 638

ch2.HTML,javascript简介-- javascript

JavaScript简介: JavaScript(Java)

thystar的专栏 637

ch5.JSP基本语法

jsp学习可以访问网站:http://www.w3cschool.cc/jsp/jsp-syntax.html 1.注释 JSP注释主要有两个作用:为代码作注释以及将某段代码注释掉。 JSP注释的语法格式: 不同情况下使用注释的语法规则: 语法 描述 JSP注释,注释内容不会被发送至浏览器甚至不会被编译

thystar的专栏 623

ch10.表达式语言

表达式语言(EL)可以方便的访问标志位(JSP中有四种标志位 :page(pageContext), request, session, application)中的属性,可以避免许多scriptlet代码。 在JSP中,只有三种代码可以出现: 接收属性判断语句迭代输出 但是开发中这点很难做到,因为JSP的输出要接收VO对象,所以,要通过表达式来避免导入vo包 表达式语言 四

thystar的专栏 593
上一篇: 数据降维工具箱drtoolbox
下一篇: 简单易学的机器学习算法——Apriori算法
thystar
博客等级 码龄17年 407粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值