news 2026/6/14 13:55:05

JavaWeb之过滤器Filter监听器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaWeb之过滤器Filter监听器

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码
  • 登陆验证……

Fitler开发步骤

添加依赖

pom.xml

<dependencies><!--Jsp依赖--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><!--Servlet依赖--><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--jstl标签依赖--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!--standard 依赖--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--连接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency></dependencies>

编写过滤器

导包

代码

实现Filter接口,重写对应的方法即可

CharacterEncondingFilter.java

publicclassCharacterEncondingFilterimplementsFilter{// Chain:链/* 1.过滤器中的所有代码,在过滤请求的时候都会执行 2.必须要过滤器继续通行,才能进行转交 chain.doFilter(request, response);死代码 * */@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");System.out.println("过滤执行前");chain.doFilter(request,response);//让我们的请求继续走,如果不写,程序在这里就会被拦截。因为如果有其他过滤也会放在链中进行交接System.out.println("过滤执行后");}// 初始化@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{//filterConfig. 可以才初始化的时候获得一些东西,但是一般没有必要这样子操作System.out.println("CharacterEncondingFilter已经初始化了");}//销毁:web服务器停止的时候,过滤器会被销毁@Overridepublicvoiddestroy(){//注销的时候也可以进行垃圾回收的额外操作://System.gc();System.out.println("CharacterEncondingFilter已经销毁了");}}

ShowServlet.java

publicclassShowServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{PrintWriterout=resp.getWriter();out.write("世界");}@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{doGet(req,resp);}}

在web.xml配置

<servlet><servlet-name>ShowServlet</servlet-name><servlet-class>com.cike.servlet.ShowServlet</servlet-class></servlet><servlet-mapping><servlet-name>ShowServlet</servlet-name><url-pattern>/show</url-pattern><url-pattern>/cn/show</url-pattern></servlet-mapping><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.cike.filter.CharacterEncondingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

监听器

实现要给监听器的接口;(有N种)

编写一个HttpSession监听器

实现监听器的接口

//统计网站在线人数:统计session//一通百通,有很多个Listener、一年也不一定学的完publicclassOnlineCountListenerimplementsHttpSessionListener{privatestaticintonlineCount=0;//创建session监听:看你的一举一动(间谍)//一旦创建一个Session就会触发一次这个事件!publicvoidsessionCreated(HttpSessionEventse){//HttpSessionEvent代表session事件的一个对象ServletContextctx=se.getSession().getServletContext();IntegeronlineCount=(Integer)ctx.getAttribute("OnlineCount");System.out.println(se.getSession().getId());if(onlineCount==null){onlineCount=newInteger(1);}else{intcount=onlineCount.intValue();onlineCount=newInteger(count+1);}ctx.setAttribute("OnlineCount",onlineCount);}//销毁session监听//一旦销毁Sesson就会触发一次这个事件!publicvoidsessionDestroyed(HttpSessionEventse){//HttpSessionEvent代表session事件的一个对象ServletContextctx=se.getSession().getServletContext();IntegeronlineCount=(Integer)ctx.getAttribute("OnlineCount");if(onlineCount==null){onlineCount=newInteger(0);}else{intcount=onlineCount.intValue();onlineCount=newInteger(count-1);}ctx.setAttribute("OnlineCount",onlineCount);}/* * Session销毁: * 手动销毁:getSession()invalidate(); * 自动销毁:web.xml中进行配置 * */}

web.xml注册监听器

<listener><listener-class>com.cike.listen.OnlineCountListener</listener-class></listener>

自动注销session.

<session-timeout><!--以分钟为单位-->1</session-timeout>

看情况是否使用

……

过滤器和监听器的常见应用(Gui编写)

  • 工具、写外挂、辅助、木马经常用到这些
publicclassTestPanel{publicstaticvoidmain(String[]args){Frametitle=newFrame("反序列化通杀工具");//创建窗体Panelpanel=newPanel(null);// 创建面板title.setLayout(null);//设置窗体布局title.setBounds(300,300,2000,2000);title.setBackground(Color.darkGray);//设置背景颜色panel.setBounds(50,50,800,800);panel.setBackground(Color.white);//设置背景颜色title.add(panel);title.setVisible(true);//监听事件,监听关闭事件title.addWindowListener(newWindowListener(){@Override//Windows打开事件publicvoidwindowOpened(WindowEvente){System.out.println("Windows打开事件");}@Override//Windows关闭中事件publicvoidwindowClosing(WindowEvente){System.out.println("Windows关闭中事件");System.exit(0);//这里的0指的是正常退出、如果是1指的是存在错误(非正常)}@Override//Windows关闭事件publicvoidwindowClosed(WindowEvente){System.out.println("Windows关闭事件");}@Override//窗体图标被激活事件publicvoidwindowIconified(WindowEvente){}@OverridepublicvoidwindowDeiconified(WindowEvente){}@Override//激活publicvoidwindowActivated(WindowEvente){System.out.println("窗体激活事件");}@Override//窗体未激活publicvoidwindowDeactivated(WindowEvente){System.out.println("窗体未激活事件");}});}}

Filter实现权限拦截(登录实验)

用户登录之后才能进入主页!用户注销后就不能进入!

用户登录之后,向Session中放入用户的数据

进入主页的时候要判断用户是否已经登录;可以过滤器实现

sysFilter.java

publicclasssysFilterimplementsjavax.servlet.Filter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequestreq,ServletResponserep,FilterChainfilterChain)throwsIOException,ServletException{// ServletRequest HttpServletRequest 类型不一样,先需要强转换// ServletResponse HttpServletResponse 类型不一样,先需要强转换HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)rep;if(request.getSession().getAttribute(Constant.USER_SESSION)==null){response.sendRedirect("/login.jsp");}filterChain.doFilter(request,response);}@Overridepublicvoiddestroy(){}}

注销的时候不建议销毁session

开发中一般不建议销毁session,因为频繁的创建session是非常消耗资源的。移除session,只是客户端的session值没了,但是服务端还在,可以做到session复用,就不需要频繁的创建session了

LogoutServlet

publicclassLogoutServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//开发中一般不建议销毁session,因为频繁的创建session是非常消耗资源的ObjectuserSession=req.getSession().getAttribute("USER_SESSION");if(userSession!=null){//移除session,只是客户端的session值没了,但是服务端还在,可以做到session复用,就不需要频繁的创建session了req.getSession().removeAttribute("USER_SESSION");resp.sendRedirect("/login.jsp");}}}

配置常量SESSION

publicclassConstant{//常量,不加final也可以//final 在Java 中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。 一旦你将引用声明作final,你将不能改变这个引用了publicfinalstaticStringUSER_SESSION="userSession";}

前端视图跳转

index.jsp

<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body><h1>当前有<span style="color: aquamarine"><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span>人在线</h1><h1><a href="${pageContext.request.contextPath}/login.jsp">管理员登录</a></h1></body></html>

login.jsp

<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>登录</title></head><body><form action="${pageContext.request.contextPath}/login"><input type="text"name="username"><input type="password"name="password"><input type="submit"value="登录"></form></body></html>

/sys/success.jsp

<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>管理员后台</title></head><body><%--没有过滤器的时候,也可以这样子进行未授权访问的验证<%ObjectuserSession=request.getSession().getAttribute("USER_SESSION");if(userSession==null){response.sendRedirect("/login.jsp");}%>--%><h1>恭喜你登陆成功</h1><p>flag{this_is_flag}</p><p><a href="${pageContext.request.contextPath}/logout">注销</a></p></body></html>

web.xml的配置

<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.cike.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping><servlet><servlet-name>logout</servlet-name><servlet-class>com.cike.servlet.LogoutServlet</servlet-class></servlet><servlet-mapping><servlet-name>logout</servlet-name><url-pattern>/logout</url-pattern></servlet-mapping><filter><filter-name>sysFilter</filter-name><filter-class>com.cike.filter.sysFilter</filter-class></filter><filter-mapping><filter-name>sysFilter</filter-name><url-pattern>/sys/*</url-pattern></filter-mapping>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 17:49:05

滚珠螺杆的内循环与外循环有何差异?

在工业4.0发展下&#xff0c;滚珠螺杆作为"直线运动之芯"&#xff0c;其循环方式直接影响设备精度与寿命。内循环结构凭借紧凑设计占据精密仪器市场&#xff0c;而外循环方案以高承载特性主导重载领域。内循环滚珠螺杆通过安装在螺母内部的反向器实现滚珠循环&#x…

作者头像 李华
网站建设 2026/6/11 9:58:09

2025NOIP T2

题目&#xff1a;感觉没紫题&#xff08;上位蓝题到下位紫&#xff0c;考虑到考场上难度自动上升半段&#xff0c;给紫题也合理首先我们考虑什么情况下会出错&#xff1a;很显然&#xff0c;对于某个数i&#xff0c;如果w2,按照贪心策略如果选中一定不会出错&#xff08;在/2的…

作者头像 李华
网站建设 2026/6/13 12:50:44

Linux常见系统故障案例说明并修复解决(上)

Linux系统故障排查思路实践教程&#xff08;下&#xff09;https://coffeemilk.blog.csdn.net/article/details/155903189 一、恢复Linux下的误删除文件 1.1、故障情况 在Linux系统上执行【rm -rf】误删除了指定分区的全部数据&#xff0c;且被删除的这个分区文件系统类型是【…

作者头像 李华
网站建设 2026/6/14 1:11:52

480万人才缺口下,零基础转行网络安全:是风口还是挑战?

网络安全作为近两年兴起的热门行业&#xff0c;成了很多就业无门但是想转行的人心中比较向往但是又心存疑惑的行业&#xff0c;毕竟网络安全的发展史比较短&#xff0c;而国内目前网安的环境和市场情况还不算为大众所知晓&#xff0c;所以到底零基础转行入门网络安全之后&#…

作者头像 李华
网站建设 2026/6/12 5:09:52

基于SpringBoot的体育馆管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题聚焦传统体育馆管理流程繁琐、场地预约低效、资源调度混乱的痛点&#xff0c;开展基于SpringBoot的体育馆管理系统的设计与实现工作。系统以Java为核心开发语言&#xff0c;依托SpringBoot框架搭建轻量高效的后端服务架构&#xff0c;负责处理场地预订、器材管理…

作者头像 李华
网站建设 2026/6/13 14:36:15

C++多线程入门

博主介绍&#xff1a;程序喵大人 35 - 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x…

作者头像 李华