Web技术基础教程 17_第1页
Web技术基础教程 17_第2页
Web技术基础教程 17_第3页
Web技术基础教程 17_第4页
Web技术基础教程 17_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb开发技术与案例教程第8章过滤器与监听器第8章知识结构8.1过滤器•8.1.1工作流程•8.1.2应用场景•8.1.3实例:过滤器的应用8.2监听器•8.2.1实现方法•8.2.2应用场景•8.2.3实例:监听器的应用8.3本章小结1第8章课程导入在JavaWeb开发中,过滤器和监听器是两种重要的组件,它们各自具有独特的应用场景和功能。过滤器作为客户端与服务器之间的“守门人”,能够在请求到达Servlet/JSP之前或响应返回客户端之后,对请求和响应进行预处理或后处理。监听器则扮演着“事件侦探”的角色,它能够监听并响应Web应用中的各类事件,如ServletContext、HttpSession、ServletRequest等对象的创建、销毁或属性变更。本章将学习过滤器和监听器在JavaWeb中的配置和使用方法。◆本章要点•理解过滤器(Filter)的工作流程,即对请求(Request)和响应(Response)进行拦截。•掌握过滤器的主要应用场景,如处理全站字符编码、登录权限检查和过滤敏感词。•掌握使用@WebFilter注解创建和配置过滤器,并通过FilterChain链放行请求。•理解监听器(Listener)的事件驱动机制,重点掌握ServletContextListener和HttpSessionListener。•掌握使用@WebListener注解创建监听器,并通过监听session创建与销毁实现网站在线人数统计。2第8章课程导入◆素养目标•弘扬工匠精神,追求代码的极致解耦:通过学习过滤器和监听器的无侵入式开发思想,理解软件工程中“高内聚、低耦合”的架构之美。•提升用户隐私保护能力,践行数据伦理:通过HttpSessionListener统计在线人数,理解在不侵犯具体用户隐私的前提下,如何进行宏观业务数据的合法收集与分析。•强化系统运行透明度,保障应用稳定性:结合ServletContextListener应用,掌握捕获应用启动与销毁事件的技巧,培养对软件全生命周期的监控意识。•构建安全过滤意识,守护清朗网络空间:通过敏感词过滤器的开发实践,理解技术在维护信息安全和文化建设中的正向作用。38.1过滤器过滤器(Filter)是在JavaWeb应用程序中,用来拦截和修改进入或离开Web应用程序的请求和响应的对象。它是三大组件(Servlet、Filter、Listener)之一。48.1.1工作流程(1)◆加载与初始化当Tomcat启动时,读取配置文件(如web.xml),扫描并加载配置的过滤器。过滤器被实例化后,会调用其init()方法进行初始化,此时可以执行资源初始化操作。◆请求拦截与处理当客户端发送HTTP请求到服务器时,服务器会首先检查是否有配置的过滤器与之匹配,如果存在匹配的过滤器,服务器会按照配置的顺序依次调用匹配的过滤器。每个过滤器在调用doFilter()方法时,可以对请求进行预处理,如验证请求是否合法、修改请求参数等。如果过滤器决定继续处理请求,它会调用chain.doFilter()方法将请求传递给下一个过滤器或目标资源。如果没有下一个过滤器或目标资源,请求将被终止。◆响应拦截与处理当目标资源处理完请求并生成响应时,响应会沿着过滤器链反向传递。每个过滤器在返回响应之前,可以对响应进行后处理,如修改响应头、响应体等。最终,处理完的响应会被发送回客户端。58.1.1工作流程(2)◆过滤器销毁当Web服务器关闭时,会调用过滤器的destroy()方法进行销毁操作。此时可以执行资源释放操作。68.1.2应用场景(1)过滤器主要用于对进入或离开Web应用程序的请求和响应进行预处理和后处理。以下是过滤器的常见应用场景。◆处理字符编码通常表单传输的数据默认使用的编码为ISO-8859-1,因此传输中文时出现乱码。过滤器可以统一设置请求和响应的字符编码,避免乱码问题。例如,使用过滤器将所有请求的字符编码设置为UTF-8,确保数据正确传输。◆检查登录权限过滤器可以用于检查用户是否已经登录,并根据用户的权限决定是否允许访问特定的资源。例如,当用户尝试访问需要登录后才能查看的页面时,过滤器可以拦截请求并检查用户的会话中是否存在有效的登录信息。如果不存在,则重定向到登录页面。如果存在,则允许访问目标资源。◆日志记录过滤器可以记录请求和响应的日志,帮助开发人员进行调试和监控。例如,记录请求的URL、请求参数、请求时间等信息,以及响应的状态码、响应内容等信息。78.1.2应用场景(2)◆过滤敏感字符过滤器可以用于过滤请求中的敏感字符,如SQL注入、XSS攻击等。通过检查请求参数中的特定字符或模式,并对其进行过滤或替换,以提高Web应用程序的安全性。◆压缩数据过滤器可以用于对响应数据进行压缩,减少网络传输流量。例如,使用Gzip压缩算法对响应数据进行压缩,并在响应头中设置相应的压缩标识,以便客户端能够正确解压数据。88.1.3实例:过滤器的应用在JavaWeb开发中,过滤器可以用于过滤敏感词,以保护Web应用程序免受恶意内容的影响。下面是一个关于如何使用过滤器过滤敏感词的详细实例。◆创建敏感词过滤器类首先,需要创建一个实现Filter接口的敏感词过滤器类。在该类中,可以定义敏感词列表,并实现过滤逻辑。代码如清单8-1所示。98.1.3实例:过滤器的应用(清单8-1SensitiveWordFilter.java)1/3packagecom.example.ch08;importjakarta.servlet.*;importjakarta.servlet.annotation.WebFilter;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletRequestWrapper;importjava.io.IOException;importjava.io.PrintWriter;//使用@WebFilter注解声明过滤器,urlPatterns="/*"表示过滤所有请求@WebFilter(urlPatterns="/*")publicclassSensitiveWordFilterimplementsFilter{//定义敏感词库(实际应用中建议从配置文件或数据库加载)privatefinalString[]sensitiveWords=newString[]{"抢","偷"};@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//设置请求字符编码为UTF-8(防止中文乱码)request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//获取响应输出流(注意:此处获取但未使用,实际过滤中不需要提前获取)PrintWriterout=response.getWriter();//创建HttpServletRequest的包装类,用于重写获取参数的方法108.1.3实例:过滤器的应用(清单8-1SensitiveWordFilter.java)2/3HttpServletRequestWrapperrequestWrapper=newHttpServletRequestWrapper((HttpServletRequest)request){//重写getParameter方法:处理单个参数值@OverridepublicStringgetParameter(Stringname){//1.获取原始参数值StringoldValue=super.getParameter(name);//若参数为空直接返回if(oldValue==null)returnnull;StringnewValue=oldValue;//2.遍历敏感词库进行替换for(Stringword:sensitiveWords){//将敏感词替换为星号newValue=newValue.replace(word,"*");}returnnewValue;}//重写getParameterValues方法:处理多值参数(如复选框)@OverridepublicString[]getParameterValues(Stringname){//1.获取原始参数值数组String[]oldValues=super.getParameterValues(name);118.1.3实例:过滤器的应用(清单8-1SensitiveWordFilter.java)3/3if(oldValues==null)returnnull;//2.创建新数组(避免修改原始数据)String[]newValues=newString[oldValues.length];for(inti=0;i<oldValues.length;i++){newValues[i]=oldValues[i];//3.对每个值进行敏感词过滤for(Stringword:sensitiveWords){newValues[i]=newValues[i].replace(word,"*");}}returnnewValues;}};//将包装后的请求对象传入过滤链(后续操作使用过滤后的参数)chain.doFilter(requestWrapper,response);}@Overridepublicvoiddestroy(){//过滤器销毁时的清理操作(本例无需特殊处理)}}128.1.3实例:过滤器的应用上述代码有以下两点需要改进:◆由于直接修改请求参数数组并不会影响原始的请求对象,因此需要使用自定义的HttpServletRequestWrapper类包装请求对象,并在包装类中覆盖相应的参数获取方法以返回过滤后的参数值。◆为了简化实例和说明过滤器的原理,上述代码并没有实现完整的敏感词过滤逻辑。在实际应用中,应该根据具体需求完善和优化过滤器的实现。配置过滤器在JavaWeb应用程序中,过滤器通常需要在web.xml文件中进行配置,或者使用注解进行配置。本书使用注解的方式配置过滤器,因此不需修改web.xml文件。使用注解配置时,过滤器的执行顺序是不确定的(依赖于容器实现或类名排序)。如果业务逻辑依赖于过滤器的先后顺序(例如先解码再验权),则必须使用web.xml配置或Spring的@Order注解。138.1.3实例:过滤器的应用◆测试过滤器编写一个JSP页面测试过滤器是否按预期工作:清单8-2所示的代码包括一个表单,表单数据提交至ShowServlet.java中处理。在该测试页面中,可以提交包含敏感词的请求参数,检查过滤器是否正确地过滤了敏感词。148.1.3实例:过滤器的应用(清单8-2filter.jsp)<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>过滤器</title></head><body><formaction="show"method="Post"><inputtype="text"name="info"/><inputtype="submit"value="提交"></form></body></html>158.1.3实例:过滤器的应用

ShowServlet.java用于展示HTTP请求参数的处理Servlet,通过注解配置为“/show”访问端点,专门处理POST请求,能够自动遍历并输出所有请求参数的值到网页和服务器控制台,通过设置UTF-8编码有效解决中文乱码问题,支持多选框等多值参数的完整展示,为表单数据处理和调试提供了便捷的工具。代码如清单8-3所示。168.1.3实例:过滤器的应用(清单8-3ShowServlet.java)1/2packagecom.example.ch08;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;@WebServlet("/show")publicclassShowServletextendsHttpServlet{/***处理POST请求的核心方法*@paramrequest包含客户端请求信息的HttpServletRequest对象*@paramresponse用于构建服务器响应的HttpServletResponse对象*@throwsIOException当输入输出操作失败时抛出*/publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{//设置响应内容类型为HTML格式,并指定字符编码response.setContentType("text/html;charset=UTF-8");//设置请求体的字符编码为UTF-8,防止中文参数乱码request.setCharacterEncoding("UTF-8");//获取响应输出流,用于向客户端发送HTML内容PrintWriterout=response.getWriter();178.1.3实例:过滤器的应用(清单8-3ShowServlet.java)2/2//遍历所有请求参数for(StringparamName:request.getParameterMap().keySet()){//获取当前参数的所有值(支持多选框等场景)String[]paramValues=request.getParameterValues(paramName);//遍历参数值数组for(inti=0;i<paramValues.length;i++){//将参数值输出到浏览器(HTML换行)out.println(paramValues[i]+"<br>");//同时将参数值输出到服务器控制台(调试用)System.out.println(paramValues[i]);}}}publicvoiddestroy(){//可在此处添加资源释放代码(如关闭数据库连接)}}188.1.3实例:过滤器的应用上述代码运行结果如图8-1所示。http://localhost:8080/ch08/filter.jsp图8-1表单提交前页面198.1.3实例:过滤器的应用提交包含敏感词的文本后,过滤器自动将敏感词替换为星号,处理结果如图8-2所示。图8-2过滤器过滤效果208.2监听器(1)

JavaWeb监听器(Listener)是一种特殊的类,用于监听Web应用程序中的事件和对象。同时也可以说,监听器是一种机制,用于监听和响应特定的事件,比如记录日志、初始化资源、清理资源等。它可以感知并响应与应用程序相关的事件,从而执行相应的逻辑处理。可以帮助开发者更好地管理Web应用程序的生命周期和资源。通过合理地使用监听器,开发者可以实现更加灵活和可扩展的Web应用程序。

JavaWeb监听器按照监听的对象和事件可以分为多种类型,常见的有以下几种:•ServletContextListener:监听ServletContext对象的创建和销毁事件。•HttpSessionListener:监听HttpSession对象的创建和销毁事件。•ServletRequestListener:监听ServletRequest对象的创建和销毁事件。218.2监听器(2)•ServletContextAttributeListener:监听ServletContext中属性的添加、修改和删除事件。•HttpSessionAttributeListener:监听HttpSession中属性的添加、修改和删除事件。•ServletRequestAttributeListener:监听ServletRequest中属性的添加、修改和删除事件。•HttpSessionBindingListener:监听对象绑定到HttpSession和从HttpSession中解除绑定的事件,不需要在web.xml中配置。•HttpSessionActivationListener:监听HttpSession对象的钝化和活化事件。228.2监听器(3)监听器的生命周期与Web应用程序的生命周期密切相关。例如,ServletContextListener会在Web应用程序启动时起作用,并在Web应用程序关闭时销毁。HttpSessionListener会在每次HttpSession创建和销毁时起作用。ServletRequestListener会在每次客户端请求到达服务器时起作用,并在服务器响应完成后销毁。238.2.1实现方法◆实现监听器要创建一个监听器,需要实现相应的监听器接口,并重写其中的方法。例如,创建一个MyListener类,实现ServletContextListener接口,并重写contextInitialized()和contextDestroyed()方法。◆配置监听器监听器可以通过在web.xml文件中声明启用,也可以使用注解(如@WebListener)进行配置。使用注解的方式更加简洁且易于管理,是推荐的做法。◆在web.xml中配置监听器例如,下面代码将com.example.ch08包下的MyListener类部署为Web应用程序的事件监听器,使其能够监控和处理Servlet上下文、会话等容器级事件。<listener><listener-class>com.example.ch08.MyListener</listener-class></listener>248.2.1实现方法◆使用注解配置监听器例如,下面代码使用@WebListener注解标记的Servlet上下文监听器类,它实现了ServletContextListener接口,能够自动监听Web应用程序的启动和销毁事件,无需在web.xml中进行配置即可在容器初始化时自动加载并执行相应的初始化或清理操作。@WebListenerpublicclassMyListenerimplementsServletContextListener{//实现方法...}258.2.2应用场景◆ServletContextListener在Web应用程序启动时加载配置文件或初始化数据库连接池等资源,在应用程序关闭时释放这些资源。清单8-4所示的代码是一个基于注解的Servlet上下文监听器实现类,通过在Web应用程序启动时执行contextInitialized方法完成系统初始化工作,在应用程序关闭时通过contextDestroyed方法进行资源清理,实现了对Web应用生命周期的完整监控和管理。268.2.2应用场景(清单8-4MyServletContextListener.java)1/2packagecom.example.ch08;importjakarta.servlet.ServletContextEvent;importjakarta.servlet.ServletContextListener;importjakarta.servlet.annotation.WebListener;//使用@WebListener注解声明这是一个监听器@WebListenerpublicclassMyServletContextListenerimplementsServletContextListener{/***当Servlet上下文(应用程序)初始化时调用*@paramsce包含ServletContext的事件对象*/@OverridepublicvoidcontextInitialized(ServletContextEventsce){//这里可以执行应用程序启动时的初始化操作//例如加载配置文件、建立数据库连接池、初始化缓存等System.out.println("加载配置文件或初始化资源...");}/***当Servlet上下文(应用程序)销毁时调用*@paramsce包含ServletContext的事件对象*/@Override278.2.2应用场景(清单8-4MyServletContextListener.java)2/2publicvoidcontextDestroyed(ServletContextEventsce){//这里可以执行应用程序关闭时的清理操作//例如关闭数据库连接、释放资源、保存应用程序状态等System.out.println("释放资源...");}}288.2.2应用场景上述代码运行结果如图8-3所示。图8-3控制台显示的监听器执行日志298.2.2应用场景◆HttpSessionListener统计在线用户数量,记录用户会话的创建和销毁时间等。清单8-5所示的代码是一个用于监控Web应用会话状态的HTTP会话监听器,通过实现HttpSessionListener接口并标注@WebListener注解,能够自动追踪当前活跃的用户会话数量,在会话创建时增加计数器并在控制台实时显示,在会话销毁时减少计数器,为系统性能监控和用户会话管理提供了有效的支持。308.2.2应用场景(清单8-5MyHttpSessionListener.java)1/2packagecom.example.ch08;importjakarta.servlet.annotation.WebListener;importjakarta.servlet.http.HttpSessionEvent;importjakarta.servlet.http.HttpSessionListener;/***自定义HTTP会话监听器*用于跟踪当前活跃的会话数量*@WebListener注解使该类能够被Servlet容器自动检测并注册为监听器*实现HttpSessionListener接口以响应会话创建/销毁事件*/@WebListenerpublicclassMyHttpSessionListenerimplementsHttpSessionListener{//活跃会话计数器privateintactiveSessions=0;/***当新会话创建时触发*@paramse包含会话信息的HttpSessionEvent对象*/@OverridepublicvoidsessionCreated(HttpSessionEventse){//计数器自增activeSessions++;318.2.2应用场景(清单8-5MyHttpSessionListener.java)2/2//输出当前活跃会话数到控制台(生产环境建议使用日志框架)System.out.println("activeSessions="+activeSessions);}/***当会话销毁时触发(包括超时或主动调用invalidate())*@paramse包含会话信息的HttpSessionEvent对象*/@OverridepublicvoidsessionDestroyed(HttpSessionEventse){//计数器自减activeSessions--;}/***获取当前活跃会话数*@return整型数值表示的活跃会话数量*/publicintgetActiveSessions(){returnactiveSessions;//返回活跃会话计数}}328.2.2应用场景上述代码运行后,模拟用户访问,控制台输出的会话创建日志果如图8-4所示。http://localhost:8080/ch08/图8-4监听器控制台输出日志338.2.2应用场景◆ServletRequestListener获取和处理客户端请求的相关信息,如请求URL、请求参数等。清单8-6所示的代码是一个用于监控Servlet请求生命周期的监听器,通过实现ServletRequestListener接口并标注@WebListener注解,能够在每个HTTP请求到达容器时触发requestInitialized方法进行初始化监控,在请求处理完成后触发requestDestroyed方法进行资源清理和性能统计,为请求级别的追踪和管理提供了有效的支持。348.2.2应用场景(清单8-6MyServletRequestListener.java)1/2packagecom.example.ch08;importjakarta.servlet.ServletRequestEvent;importjakarta.servlet.ServletRequestListener;importjakarta.servlet.annotation.WebListener;/***Servlet请求生命周期监听器*该监听器用于监控Servlet请求的创建和销毁事件,*通过实现ServletRequestListener接口实现请求级别的监控。*使用@WebListener注解注册为Servlet监听器。*/@WebListenerpublicclassMyServletRequestListenerimplementsServletRequestListener{/***请求初始化时触发(请求到达容器时)*@paramsre包含请求信息的ServletRequestEvent对象*可通过sre.getServletRequest()获取请求对象*/@OverridepublicvoidrequestInitialized(ServletRequestEventsre){//获取和处理请求信息...System.out.println("requestInitialized()invoke...");}358.2.2应用场景(清单8-6MyServletRequestListener.java)2/2/***请求销毁时触发(请求处理完成时)*@paramsre包含请求信息的ServletRequestEvent对象*可通过sre.getServletRequest()获取请求对象*/@OverridepublicvoidrequestDestroyed(ServletRequestEventsre){//实际开发中可在此处进行://1.资源清理(如关闭数据库连接)//2.性能统计//3.异常处理//4.请求追踪信息输出}}368.2.2应用场景上述代码运行结果如图8-5所示。http://localhost:8080/ch08/图8-5ServletRequestListener运行日志378.2.3实例:监听器的应用本实例使用监听器统计网站在线人数,每当有一个用户访问连接到服务器时,服务器就会创建一个session管理会话。那么就可以通过统计session的数量获得当前在线人数。所以这里用到的是HttpSessionBindingListener。【注意】由于浏览器会保存一段时间session数据,所以需要使用几个不同的浏览器测试在线人数效果。◆创建监听器类清单8-7所示的代码是一个实现HttpSessionBindingListener接口的会话绑定监听器,用于精确追踪单个会话对象的绑定状态变化,当该监听器对象被绑定到会话时自动触发valueBound方法增加活跃会话计数,当从会话中解绑时触发valueUnbound方法减少计数,为会话级别的用户登录状态监控提供了精细化的管理能力。388.2.3实例:监听器的应用(清单8-7HttpSessionBindTestListener.java)1/2packagecom.example.ch08;importjakarta.servlet.annotation.WebListener;importjakarta.servlet.http.HttpSessionBindingEvent;importjakarta.servlet.http.HttpSessionBindingListener;/***HTTP会话绑定监听器*用于跟踪会话的创建和销毁,统计当前活跃会话数量*@WebListener*实现HttpSessionBindingListener接口以响应对象绑定/解绑事件*/publicclassHttpSessionBindTestListenerimplementsHttpSessionBindingListener{//静态计数器:记录当前活跃的会话数量privatestaticintcount=0;/***获取当前活跃会话数量*@return整型数值表示的会话数量*/publicstaticintgetCount(){returncount;}/***当对象被绑定到会话时触发(会话创建时)398.2.3实例:监听器的应用(清单8-7HttpSessionBindTestListener.java)2/2*@paramsce包含会话绑定信息的HttpSessionBindingEvent对象*/@OverridepublicvoidvalueBound(HttpSessionBindingEventsce){//模拟用户登录操作System.out.println("登录valueBound");count++;//活跃会话数+1}/***当对象从会话解绑时触发(会话销毁时)*@paramsce包含会话解绑信息的HttpSessionBindingEvent对象*/@OverridepublicvoidvalueUnbound(HttpSessionBindingEventsce){//模拟用户退出操作System.out.println("退出valueUnbound");count--;//活跃会话数-1}}408.2.3实例:监听器的应用

HttpSessionBindingListener与其他监听器不同,它不需要在web.xml或使用@WebListener中注册。相反,它由被监听的对象在绑定到session或从session解绑时自动触发。在接下来的LoginServlet中,当执行session.setAttribute()时,valueBound方法将被调用;当session销毁或执行removeAttribute时,valueUnbound方法将被调用。利用这个机制来增减静态变量count,可以实现对在线人数的统计。Servlet处理数据◆登录及监听数据处理清单8-8所示的代码是处理用户登录功能的Servlet,通过接收用户名和密码参数进行凭证验证,成功后将用户信息存入会话并绑定会话监听器来追踪在线用户数量,同时更新应用上下文中的用户计数,最后跳转到主页面,实现了完整的登录状态管理和用户会话跟踪功能。418.2.3实例:监听器的应用(清单8-8LoginServlet.java)1/2packagecom.example.ch08;importjakarta.servlet.ServletException;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importjava.io.IOException;/***登录处理Servlet*当前Servlet用于处理用户登录请求,主要功能包括:*1.接收并验证登录凭证*2.管理用户会话状态*3.维护在线用户计数*4.实现页面跳转控制*/@WebServlet("/loginServlet")publicclassLoginServletextendsHttpServlet{/***处理POST请求(登录表单提交)*@paramrequest包含客户端请求信息的HttpServletRequest对象*@paramresponse用于构建服务器响应的HttpServletResponse对象*/428.2.3实例:监听器的应用(清单8-8LoginServlet.java)2/2protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//从请求参数中获取用户名和密码(注意:实际项目应进行参数校验和过滤)Stringuser=request.getParameter("user");Stringpwd=request.getParameter("pwd");//将用户名存入会话(创建新会话或获取现有会话)request.getSession().setAttribute("user",user);//简单验证凭证非空(实际项目应进行数据库验证和密码加密校验)if(user!=null&&pwd!=null){//在会话中绑定自定义监听器测试对象(演示HttpSessionBindingListener)request.getSession().setAttribute("HttpSessionBindTestListener",newHttpSessionBindTestListener());//更新应用级上下文中的在线用户计数(演示ServletContext属性监听)getServletContext().setAttribute("usercount",HttpSessionBindTestListener.getCount());//转发到主页面(保持请求对象,地址栏不变)request.getRequestDispatcher("main.jsp").forward(request,response);}else{//重定向到登录页面(客户端重新发起请求,地址栏变化)response.sendRedirect("login.jsp");}}}438.2.3实例:监听器的应用

LoginServlet是监听器模式的核心调度者。在doPost方法中,它执行了三个关键的setAttribute操作:1)session.setAttribute("user",user):存储当前用户名,用于页面显示。2)session.setAttribute("HttpSessionBindTestListener",...):触发监听器。当这个HttpSessionBindTestListener实例被绑定到session时,其valueBound方法被调用,使在线人数count增加1。3)getServletContext().setAttribute("usercount",...):将更新后的count值存入application作用域(ServletContext),以便main.jsp能够获取并展示给所有用户。◆退出销毁对象处理清单8-9所示的代码是一个处理用户退出登录的Servlet,通过使当前会话立即失效来清除用户登录状态,并重定向到登录页面,确保用户安全退出且浏览器地址栏更新,符合Web安全最佳实践。448.2.3实例:监听器的应用(清单8-9LogoutServlet.java)1/2packagecom.example.ch08;importjakarta.servlet.ServletException;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importjava.io.IOException;/***用户退出登录处理Servlet*本Servlet用于处理用户退出登录操作,主要功能包括:*1.销毁当前会话(Session)*2.重定向到登录页面*使用@WebServlet注解配置访问路径为"/logoutServlet",*支持GET和POST两种请求方式*/@WebServlet("/logoutServlet")publicclassLogoutServletextendsHttpServlet{/***处理GET请求(通常由链接或地址栏直接访问触发)*@paramrequestHTTP请求对象*@paramresponseHTTP响应对象*/458.2.3实例:监听器的应用(清单8-9LogoutServlet.java)2/2protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//使当前会话立即失效,清除所有会话属性//注意:invalidate()会立即销毁session,后续获取session将得到新实例request.getSession().invalidate();//重定向到登录页面(客户端跳转,地址栏变化)//使用重定向而非转发,确保退出后浏览器地址栏更新response.sendRedirect("login.jsp");}/***处理POST请求(通常由表单提交触发)*@paramrequestHTTP请求对象*@paramresponseHTTP响应对象*直接调用doGet()方法保持逻辑统一,*符合HTTPPOST-REDIRECT-GET模式最佳实践*/protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}468.2.3实例:监听器的应用

LogoutServlet退出登录的操作相对简单。doGet方法被触发时(通常通过main.jsp的“退出登录”链接),核心代码是request.getSession().invalidate()。调用invalidate()方法会立即使当前session失效。这个动作会触发HttpSessionBindingListener的valueUnbound方法(因为之前绑定的监听器实例随session一同被销毁),从而使在线人数count减少1,并更新ServletContext中的usercount值。最后,通过sendRedirect将用户重定向回登录页面。前端页面◆登录界面清单8-10所示的代码是一个简洁的人力资源系统教职工登录页面,提供用户名和密码输入表单,通过POST方式提交到log

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论