news 2026/1/22 10:59:30

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/1/13 9:09:21

使用Dify智能体平台集成Qwen3-8B构建企业级知识问答系统

使用Dify智能体平台集成Qwen3-8B构建企业级知识问答系统 在企业数字化转型不断深入的今天&#xff0c;员工每天面对的信息量呈指数级增长——从内部制度、项目文档到产品手册&#xff0c;知识分散且查找困难。与此同时&#xff0c;客户对服务响应速度和准确性的要求越来越高。传…

作者头像 李华
网站建设 2025/12/26 5:59:23

LeetCode 2110.股票平滑下跌阶段的数目:数学(一次遍历)

【LetMeFly】2110.股票平滑下跌阶段的数目&#xff1a;数学&#xff08;一次遍历&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-smooth-descent-periods-of-a-stock/ 给你一个整数数组 prices &#xff0c;表示一支股票的历史每日股价&#…

作者头像 李华
网站建设 2026/1/21 11:19:40

智慧树学习助手:3分钟完成自动化学习配置的完整指南

智慧树学习助手&#xff1a;3分钟完成自动化学习配置的完整指南 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的冗长视频课程烦恼吗&#xff1f;手动…

作者头像 李华
网站建设 2026/1/17 12:52:49

Windows虚拟显示器完整教程:免费扩展你的数字工作空间

Windows虚拟显示器完整教程&#xff1a;免费扩展你的数字工作空间 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址: https://gitcod…

作者头像 李华