版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目十一Servlet高级特性11.1
Filter在Servlet高级特性中,Filter即过滤器。Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,它位于客户端和处理程序之间,能够对请求和响应进行检查和修改。Filter就好比污水净化设备,专门用于过滤请求和响应中的“杂质”。Filter在Web应用中的拦截过程如图所示。11.1.1
Filter简介Filter在Web应用中的拦截过程11.1
Filter1.Filter接口11.1.2
Filter相关接口表Filter接口中的方法方法功能描述init(FilterConfigfilterConfig)init()方法是Filter的初始化方法,创建Filter实例后将调用init()方法。该方法的参数filterConfig用于读取Filter的初始化参数doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)doFilter()方法负责完成实际的过滤操作,当客户端的请求满足过滤规则时,Servlet容器将调用Filter的doFilter()方法完成实际的过滤操作。doFilter()方法有多个参数,其中,参数request和response为Web服务器或Filter链中的上一个Filter传递过来的请求和响应对象;参数chain代表当前Filter链destroy()该方法用于释放被Filter打开的资源(例如关闭数据库和
I/O流)。destroy()方法在Web服务器销毁Filter时被调用11.1
Filter2.FilterConfig接口表FilterConfig接口中的方法方法功能描述StringgetFilterName()返回Filter的名称ServletContextgetServletContext()返回FilterConfig对象中封装的ServletContext对象StringgetInitParameter(Stringname)返回名为name的初始化参数的值EnumerationgetInitParameterNames()返回包含Filter所有初始化参数的Enumeration对象3.FilterChain接口FilterChain接口的doFilter()方法用于调用Filter链中的下一个过滤器。如果这个Filter是Filter链上的最后一个Filter,则将请求提交给处理程序或将响应发送给客户端。11.1
Filter11.1.3
Filter的生命周期Filter的生命周期指的是一个Filter对象从创建到执行再到销毁的过程。Filter接口中的3个方法就是管理Filter的生命周期的方法。下面依次介绍Filter的生命周期的3个阶段。Web服务器启动的时候会创建Filter实例,并调用init()方法,完成Filter的初始化。需要注意的是,在一次完整的请求当中,Filter实例只会创建一次,init()方法也只会执行一次。01创建阶段当客户端请求目标资源时,Web服务器会筛选出符合映射条件的Filter实例,并按照类名的先后顺序依次执行doFilter()方法。02执行阶段Web服务器关闭时调用destroy()方法销毁Filter对象。03销毁阶段11.1
Filter11.1.4实现Filter下面通过一个案例演示Filter如何对Servlet容器调用Servlet过程进行拦截。在IDEA中创建名称为ServletHighDemo的Web项目,在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh01的类,其具体代码如下。案例
实现Filter(资源位置:项目11\源文件\DemoServletHigh01.java)importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet(name="DemoServletHigh01",urlPatterns="/DemoServletHigh01")publicclassDemoServletHigh01extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ response.getWriter().println("HelloDemoServletHigh01");}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}页面输出“HelloDemoServletHigh01”11.1
Filter接下来创建Filter,在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh02的Filter类,其具体代码如下。案例
实现Filter(资源位置:项目11\源文件\DemoServletHigh02.java)importjavax.servlet.ServletException;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.*;@WebFilter(filterName="DemoServletHigh02",urlPatterns="/DemoServletHigh01")publicclassDemoServletHigh02implementsFilter{publicvoidinit(FilterConfigfConfig)throwsServletException{//在初始化时调用,可以配置一些初始化参数}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//用于拦截用户的请求,如果和当前Filter的拦截路径匹配,该方法会被调用PrintWriterout=response.getWriter();out.write("HelloDemoServletHigh02Filter");}publicvoiddestroy(){//过滤器对象在销毁时自动调用,释放资源}}页面显示的结果11.1
FilterDemoServletHigh02.java中用到了@WebFilter注解,该注解的属性filterName用于设置Filter的名称,urlPatterns属性用于匹配用户请求的URL。@WebFilter注解的常用属性如表所示。属性名类型描述filterNameString指定Filter的名称。默认是Filter类的名称urlPatternsString[]指定一组Filter的URL匹配模式valueString[]该属性等价于urlPatterns属性,urlPatterns和value属性不能同时使用servletNamesString[]指定Filter将应用于哪些Servlet,取值是
@WebServlet中的name属性的取值dispatcherTypesDispatcherType指定Filter的转发模式,具体取值包括ERROR、FORWARD、INCLUDE、REQUESTinitParamsWebInitParam[]指定Filter的一组初始化参数表
@WebFilter注解的常用属性11.1
Filter11.1.5
Filter映射如果想让过滤器拦截所有请求,可以使用通配符“/*”实现,即将urlPatterns属性配置成“/*”。使用通配符“/*”拦截所有请求01在@WebFilter注解有一个特殊的属性—dispatcherTypes,它可以指定Filter的转发模式,dispatcherTypes属性有4个常用值:拦截不同访问方式的请求02REQUEST:如果用户通过RequestDispatcher对象的include()方法或forward()方法访问目标资源,那么Filter不会被调用。除此之外,该Filter会被调用。INCLUDE:如果用户通过RequestDispatcher对象的include()方法访问目标资源,那么Filter将被调用。除此之外,该Filter不会被调用。FORWARD:如果通过RequestDispatcher对象的forward()方法访问目标资源,那么Filter将被调用。除此之外,该Filter不会被调用。ERROR:如果通过声明式异常处理机制调用目标资源,那么Filter将被调用。除此之外,Filter不会被调用。11.1
Filter在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh03的Servlet类,其具体代码如下。案例
在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh03的Servlet类,其具体代码如下。importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet(name="DemoServletHigh03",urlPatterns="/DemoServletHigh03")publicclassDemoServletHigh03extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{request.getRequestDispatcher("/DemoServletHigh01.jsp").forward(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}11.1
Filter在ServletHighDemo项目的Web目录下创建DemoServletHigh01.jsp页面,其具体代码如下。案例
实现Filter(资源位置:项目11\源文件\DemoServletHigh01.jsp)<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>DemoServletHigh01.jsp</title><scripttype="text/javascript"src="jquery-3.7.1.js"></script></head><body>DemoServletHigh01.jsp</body></html>在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh04的Filter类,其具体代码如下。案例
实现Filter(资源位置:项目11\源文件\DemoServletHigh04.java)11.1
Filterimportjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;importjava.io.PrintWriter;@WebFilter(filterName="DemoServletHigh04",urlPatterns="/DemoServletHigh01.jsp")publicclassDemoServletHigh04implementsFilter{publicvoidinit(FilterConfigfConfig)throwsServletException{//在初始化时调用,可以配置一些初始化参数}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//用于拦截用户的请求,如果和当前Filter的拦截路径匹配,该方法会被调用PrintWriterout=response.getWriter();out.write("HelloDemoServletHigh01.jsp");}publicvoiddestroy(){//在销毁Filter时自动调用,释放资源}}在IDEA中启动项目ServletHighDemo,使用浏览器访问地址“http://localhost:8080/DemoServletHigh03”,跳转到DemoServletHigh01.jsp页面,如图所示。11.1
Filter如果要拦截DemoServletHigh03类通过forward()方法转发到DemoServletHigh01.jsp页面的请求,可以修改DemoServletHigh04.java中的代码,在@WebFilter注解中设置dispatcherTypes属性值为FORWARD,具体代码如下:@WebFilter(filterName="ForwardFilter",urlPatterns="/DemoServletHigh01.jsp",dispatcherTypes=DispatcherType.FORWARD)修改之后,再次在IDEA中启动项目ServletHighDemo,使用浏览器访问地址“http://localhost:8080/DemoServletHigh03”,页面显示doFilter()里面的输出信息,如图所示。页面显示doFilter()里面的输出信息11.1
Filter11.1.6
Filter链在一个Web应用程序中可以注册多个Filter,每个Filter都可以针对不同URL的请求进行拦截。如果多个Filter都对同一个URL的请求进行拦截,那么这些Filter就组成一条Filter链。Filter链使用FilterChain对象表示,FilterChain对象提供了doFilter()方法,该方法的作用是让Filter链上的当前Filter放行请求,使请求进入下一个Filter。Filter链的拦截过程(以两个Filter为例)如图所示。Filter链的拦截过程11.2监听器Listener11.2.1监听器Listener简介Listener的监听过程涉及几个重要的组成部分,具体如下。事件:用户的一个操作(如单击一个按钮、调用一个方法、创建一个对象等)。事件源:产生事件的对象。事件监听器:负责监听发生在事件源上的事件。事件处理器:监听器的成员方法,当事件发生的时候会触发对应的事件处理器。事件监听器的工作过程可分为以下几个步骤。(1)将监听器绑定到事件源,也就是注册监听器。(2)监听器监听到事件发生时,会调用自己的成员方法,将事件传递给事件处理器,即触发事件处理器。(3)事件处理器通过事件获得事件源,并对事件源进行处理。11.2监听器Listener11.2.2创建ListenerListener共有8个不同的监听器接口,分别用于监听不同的对象,具体如表所示。名称描述ServletContextListener用于监听ServletContext对象的创建和销毁过程HttpSessionListener用于监听HttpSession对象的创建和销毁过程ServletRequestListener用于监听ServletRequest对象的创建和销毁过程ServletContextAttributeListener用于监听ServletContext对象中的属性变更HttpSessionAttributeListener用于监听HttpSession对象中的属性变更ServletRequestAttributeListener用于监听ServletRequest对象中的属性变更HttpSessionBindingListener用于监听JavaBean对象绑定到HttpSession对象和JavaBean对象从HttpSession对象解绑HttpSessionActivationListener用于监听HttpSession中对象活化和钝化的过程11.2监听器ListenerListener的8种Servlet事件监听器可以分为3类,具体如下。(1)用于监听域对象创建和销毁过程的Listener:ServletContextListener、HttpSessionListener和ServletRequestListener。(2)用于监听域对象属性变更的监听器:ServletContextAttributeListener、HttpSession-AttributeListener和ServletRequestAttributeListener。(3)用于监听绑定到HttpSession对象的某个对象的状态变化的事件监听器:HttpSession-BindingListener和HttpSessionActivationListener。11.2监听器Listener在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh05的Listener类,其具体代码如下。importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.ServletRequestEvent;importjavax.servlet.ServletRequestListener;importjavax.servlet.annotation.WebListener;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;@WebListenerpublicclassDemoServletHigh05implementsServletContextListener,HttpSessionListener,ServletRequestListener{publicvoidcontextInitialized(ServletContextEventarg0){System.out.println("ServletContext对象被创建了");}publicvoidcontextDestroyed(ServletContextEventarg0){System.out.println("ServletContext对象被销毁了");}publicvoidrequestInitialized(ServletRequestEventservletRequestEvent){System.out.println("ServletRequestEvent对象被创建了");}publicvoidrequestDestroyed(ServletRequestEventservletRequestEvent){System.out.println("ServletRequestEvent对象被销毁了");}publicvoidsessionCreated(HttpSessionEventhttpSessionEvent){System.out.println("HttpSessionEvent对象被创建了");}publicvoidsessionDestroyed(HttpSessionEventhttpSessionEvent){System.out.println("HttpSessionEvent对象被销毁了");}}案例
ServletContext对象(资源位置:项目11\源文件\DemoServletHigh05.java)11.2监听器Listener在IDEA中启动项目ServletHighDemo,IDEA控制台输出“ServletContext对象被创建了”,如图所示。为了查看ServletContext对象的销毁信息,可以将已经启动的Web服务器关闭,关闭Web服务器之后,IDEA控制台输出“ServletContext对象被销毁了”,窗口显示的结果如图所示。IDEA控制台输出“ServletContext对象被创建了”IDEA控制台输出“ServletContext对象被销毁了”11.2监听器Listener为了查看HttpSessionListener和ServletRequestListener的运行效果,在ServletHighDemo项目的Web目录下创建名称为DemoServletHigh02.jsp的页面,其具体代码如下。案例
ServletContext对象(资源位置:项目11\源文件\DemoServletHigh02.jsp)<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>DemoServletHigh02.jsp</title></head><body>
这是一个测试监听器的页面</body></html>为了尽快查看到HttpSessionEvent对象创建和销毁,可以在ServletHighDemo项目的Web.xml文件中设置session的超时时间为2分钟,具体代码如下。<session-config><session-timeout>2</session-timeout></session-config>11.2监听器Listener重新启动项目ServletHighDemo,再打开浏览器,在地址栏中输入“http://localhost:8080/DemoServletHigh02.jsp”,并按“Enter”键。IDEA控制台输出与ServletRequestEvent对象相关的内容,如图所示。IDEA控制台输出与ServletRequestEvent对象相关的内容对应的HttpSessionEvent对象将在2分钟之后被销毁,IDEA控制台输出“HttpSessionEvent对象被销毁了”,如下图所示。IDEA控制器输出“HttpSessionEvent对象被销毁了”11.3文件的上传11.3.1文件上传原理在Web开发中,要实现文件上传功能,通常需要完成两步操作:一是在Web项目的页面中添加文件上传输入项;二是在Servlet中读取上传文件的数据,并保存到目标路径中。<inputtype="file">标签的使用需要注意以下两点。<%--指定<form>标签的enctype属性和method属性--%><formenctype="multipart/form-data"method="post"> <%--指定<input>标签的type属性和name属性--%>
选择上传文件:<inputtype="file"name="myfile"/><br/></form>必须要设置<input>标签的name属性,否则浏览器将不会向服务器发送上传文件的数据。必须把将<form>标签的enctype属性设置为“multipart/form-data”,method属性设置为“post”。需要注意的是,在使用Commons-FileUpload组件时,需要导入commons-fileupload.jar和commons-io.jar两个JAR包。11.3文件的上传1.FileItem接口11.3.2认识Commons-FileUpload组件FileItem接口主要用于封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem对象。Commons-FileUpload组件在处理文件上传时,将每一个表单域(包括普通文本表单域和文件域)封装在一个FileItem对象中。方法声明功能描述booleanisFormField()isFormField()方法用于判断FileItem对象封装的是一个普通文本表单字段,还是一个文件表单字段,如果是普通文本表单字段则返回true,否则返回falseStringgetName()getName()方法用于获取文件上传字段中的文件名。如果FileItem对象对应的是普通文本表单字段,getName()方法将返回null;否则,只要浏览器将文件的字段信息传递给服务器,getName()方法就会返回一个String类型的结果(如“C:\Sunset.jpg”)StringgetFieldName()getFieldName()方法用于获取表单字段元素描述头的name属性值,也是<form>标签name属性的值。例如“name=file1”中的“file1”表FileItem类的方法11.3文件的上传方法声明功能描述voidwrite(Filefile)write()方法用于将FileItem对象中保存的主体内容保存到某个指定的文件中。如果FileItem对象中的主体内容保存在某个临时文件中,那么该方法调用成功后,临时文件有可能会被清除。另外,该方法也可将普通文本表单字段内容写入一个文件中,但它主要用于将上传的文件内容保存到本地文件系统中StringgetString()getString()方法用于将FileItem对象中保存的主体内容以字符串的形式返回。它有两个重载的定义形式:①publicStringgetString();②publicStringgetString(java.lang.Stringencoding)。前者使用默认的字符编码将主体内容转换成字符串,后者使用encoding参数指定的字符编码将主体内容转换成字符串StringgetContentType()getContentType()方法用于获得上传文件的类型,即表单字段元素描述头属性Content-Type的值(如“image/jpeg”)。如果FileItem对象对应的是普通文本表单字段,该方法将返回null续表11.3文件的上传2.DiskFileItemFactory类DiskFileItemFactory类用于将请求消息实体内容中的每一个文件封装成单独的FileItem对象。如果上传的文件比较小,则将其直接保存在内存中;如果上传的文件比较大,则会以临时文件的形式,将其保存在磁盘的临时文件夹中。表DiskFileItemFactory类的构造方法方法声明功能描述DiskFileItemFactory()采用默认的大小临界值和系统临时文件夹构造文件项工厂对象DiskFileItemFactory(intsizeThreshold,Filerepository)采用参数指定的大小临界值和系统临时文件夹构造文件项工厂对象3.ServletFileUpload类ServletFileUpload类是Apache组件处理文件上传请求的核心高级类。通过调用parseRequest(HttpServletRequest)方法,它可以将HTML中每个表单提交的数据封装成一个FileItem对象,然后以List列表的形式返回。表ServletFileUpload类的构造方法方法声明功能描述ServletFileUpload()构造一个未初始化的ServletFileUpload对象ServletFileUpload(FileItemFactoryfileItemFactory)根据参数指定的FileItemFactory对象构造一个ServletFileUpload对象11.3文件的上传11.3.3使用Commons-FileUpload组件要实现文件上传功能,需要使用CommonsFileUpload组件,并将JSP页面<form>标签的enctype属性值设置为“multipart/form-data”,再在Servlet中使用I/O流实现文件的上传。下面通过一个案例演示文件上传功能的实现。在ServletHighDemo项目的Web目录下创建名称为DemoServletHigh03.jsp的页面,具体代码如下。案例
文件上传功能的实现(资源位置:项目11\源文件\DemoServletHigh03.jsp)<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>DemoServletHigh03.jsp</title></head><body><formaction="DemoServletHigh06"method="post"enctype="multipart/form-data"><tablewidth="600px"><tr><td>上传者</td><td><inputtype="text"name="name"/></td></tr><tr><td>上传文件</td><td><inputtype="file"name="myfile"></td></tr><tr><tdcolspan="2"><inputtype="submit"value="上传"/></td></tr></table></form></body></html>11.3文件的上传在ServletHighDemo项目的srm目录下创建名称为DemoServletHigh06的Servlet类,其具体代码如下。importmons.fileupload.FileItem;importmons.fileupload.disk.DiskFileItemFactory;importmons.fileupload.servlet.ServletFileUpload;importjavax.servlet.ServletException;importjavax.servlet.annotation.MultipartConfig;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.*;importjava.util.List;importjava.util.UUID;@WebServlet(name="DemoServletHigh06",urlPatterns="/DemoServletHigh06")@MultipartConfigpublicclassDemoServletHigh06extendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{案例
文件上传功能的实现(资源位置:项目11\源文件\DemoServletHigh06.java)11.3文件的上传try{//设置Content-Type字段值response.setContentType("text/html;charset=utf-8");//创建DiskFileItemFactory工厂对象DiskFileItemFactoryfactory=newDiskFileItemFactory();//设置文件缓存目录,如果该目录不存在则创建Filef=newFile("E:\\TempFolder");if(!f.exists()){f.mkdirs();}//设置文件的缓存路径factory.setRepository(f);//创建ServletFileUpload对象ServletFileUploadfileupload=newServletFileUpload(factory);//设置字符编码fileupload.setHeaderEncoding("utf-8");//解析request,得到上传文件的FileItem对象List<FileItem>fileitems=fileupload.parseRequest(request);//获取字符流PrintWriterwriter=response.getWriter();//遍历集合for(FileItemfileitem:fileitems){//判断是否为普通字段if(fileitem.isFormField()){//获得字段名和字段值Stringname=fileitem.getFieldName();if(name.equals("name")){//如果文件不为空,将其保存在value中if(!fileitem.getString().equals("")){Stringvalue=fileitem.getString("utf-8");writer.print("上传者:"+value+"<br/>");}}}else{//获取上传文件的名称Stringfilename=fileitem.getName();//处理上传文件if(filename!=null&&!filename.equals("")){11.3文件的上传writer.print("上传文件的名称是:"+filename+"<br/>");//截取出文件名filename=filename.substring(filename.lastIndexOf("\\")+1);//文件名需要唯一filename=UUID.randomUUID().toString()+"_"+filename;//在服务器中创建同名文件StringWebPath="E:\\workspace\\ServletHighDemo\\upload\\";//将服务器中文件夹路径与文件的名称组合成完整的服务器端路径Stringfilepath=WebPath+filename;//创建文件
Filefile=newFile(filepath);file.getParentFile().mkdirs();file.createNewFile();//获得上传文件流InputStreamin=fileitem.getInputStream();//使用FileOutputStream()打开服务器端的上传文件FileOutputStreamout=newFileOutputStream(file);//流的复制byte[]buffer=newbyte[1024];//每次读取1个字节intlen;11.3文件的上传//开始读取上传文件的内容,并将其输出到服务器的上传文件输出流中while((len=in.read(buffer))>0)out.write(buffer,0,len);//关闭流in.close();out.close();//删除临时文件fileitem.delete();writer.print("上传文件成功!<br/>");writer.print("上传的路径为:"+filepath);}}}}catch(Exceptione){thrownewRuntimeException(e);}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{ doGet(request,response);}}选择要上传的文件在地址栏中输入“http://localhost:8080/DemoServletHigh03.jsp”,并按“Enter”键来访问页面。在页面中填写“上传者”的内容,选择要上传的文件,如图所示。11.3文件的上传单击页面中的“上传”按钮,页面会显示文件上传成功的信息,如图所示。在计算机中进入上图的文件上传路径,查看上传的文件,如图所示。文件上传成功的信息查看上传的文件【商业实例】仿公司OA管理系统实现登录拦截任务一修改登录的Servlet类,在登录成功后往HttpServletResponse中插入cookie值在LoginServlet类中添加如下代码。(代码位置:项目11\商业实例\LoginServlet.java)//往HttpServletResponse对象中插入cookieCookiecookie=newCookie("samCookie",name);response.addCookie(cookie);任务二
创建LoginFilter,拦截请求创建LoginFilter,如果从HttpServletRequest对象中未能获取到登录成功后插入的cookie值,则跳转到登录页面。(代码位置:项目11\商业实例\LoginFilter.java)importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.Cookie;【商业实例】仿公司OA管理系统实现登录拦截importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.util.Arrays;importjava.util.List;@WebFilter(filterName="LoginFilter",urlPatterns="/*")publicclassLoginFilterimplementsFilter{//设置不被拦截的路径privatestaticfinalList<String>unFilterUrlList=Arrays.asList("/LoginServlet","/RegisterServlet","/login.jsp","/register.jsp");/*判断请求路径是否为不被拦截的路径*/privatebooleanisFilter(Stringurl){for(Strings:unFilterUrlList){if(url.contains(s)){returnfalse;}}returntrue;}publicvoidinit(FilterConfigfConfig)throwsServletException{//在初始化时调用,可以配置一些初始化参数}publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)servletRequest;【商业实例】仿公司OA管理系统实现登录拦截HttpServletResponseresponse=(HttpServletResponse)servletResponse;response.setContentType("application/json;charset=UTF-8");booleanfilter=isFilter(request.getRequestURL().toString());if(filter){Cookie[]cookies=request.getCookies();if(cookies!=null){booleanflag=false;for(Cookiecookie1:cookies){if(cookie1.getName().equals("samCookie")){flag=true;break;}else{flag=false;}}if(!flag){response.sendRedirect("/login.jsp");}else{chain.doFilter(request,response);}}else{response.sendRedirect("/login.jsp");}}else{chain.doFilter(request,response);}}publicvoiddestroy(){//Filter在销毁时自动调用,释放资源}}登录页面项目小结本项目主要讲解了Servlet高级特性的相关知识。首先讲解了Filter,包括Filter的基本知识、Filter相关接口、Filter的生命周期、实现Filter、Filter映射和Filter链。之后讲解了Listener,包括Listener的基本知识和创建监听器。最后讲解了文件上传原理以及CommonsFileUpload的相关知识。通过对本项目的学习,读者应该能熟练掌握Servlet高级特性的相关知识。综合实训下面通过综合实训让读者对Listener的使用有更加深入的理解。使用Listener,实现监听会话一、实训目的(1)更深入地了解Servlet高级特性中Listener的工作原理,以及Listener在Web应用程序的开发中扮演着什么样的重要角色。(2)通过动手实践,将理论知识应用于实际操作,提升编程实践能力。二、实训内容Listener用于监听Web应用程序中的事件(如上下文初始化、会话创建等)。将创建Listener,用于监听会话的创建和销毁事件,统计会话数。(1)创建名称为UserCounterListener的Listener,实现统计会话数。importjavax.servlet.annotation.WebListener;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;综合实训使用Listener,实现监听会话@WebListenerpublicclassUserCounterListenerimplementsHttpSessionListener{//使用一个静态变量来统计会话数privatestaticintactiveSessions=0;publicvoidsessionCreated(HttpSessionEventse){activeSessions++;}publicvoidsessionDestroyed(HttpSessionEventhttpSessionEvent){if(activeSessactiveSessions--;}}//添加一个静态方法用于获取当前的会话数publicstaticintgetActiveSessions(){returnactiveSessions;}}(2)创建delete.jsp页面,实现销毁会话。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>ys在线人数</title></head>综合实训使用Listener,实现监听会话<body>销毁session<%request.getSession().invalidate();%></body></html>(3)创建名称为UserListenerServletHigh的Ser
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生命末期儿童家庭的心理支持方案
- 现代检验技术辅助中医治未病个体化方案
- 旅游产品运营面试题及答案大全
- 深度解析(2026)《GBT 19351-2003金属覆盖层 金属基体上金覆盖层孔隙率的测定 硝酸蒸汽试验》
- 环境因素与个性化健康干预整合方案
- 年产xxx六角螺母项目可行性分析报告
- 功能薄膜项目可行性分析报告范文(总投资9000万元)
- 游戏行业游戏策划师面试题集
- 工具架建设项目可行性分析报告(总投资9000万元)
- 深度解析(2026)《GBT 18904.4-2002半导体器件 第12-4部分光电子器件 纤维光学系统或子系统用带不带尾纤的Pin-FET模块空白详细规范》
- 浙江省湖州市2024-2025学年高二上学期期末考试 英语 含答案
- 四年级寒假语文
- 贵州省黔东南州2023-2024学年七年级上学期数学期末考试试卷(含答案)
- 《中药的现代化》课件
- 电梯维保服务投标方案(技术方案)
- 超星尔雅学习通《三国志导读(复旦大学)》2024章节测试含答案
- 【地理】产业转移第一课时课件 2023-2024学年高中地理人教版(2019)选择性必修2
- 块石挡土墙砌筑
- 三查四定管理制度(参考模板)
- 新录用国家公务员任职定级审批表
- 2023年中证金融研究院事业单位招聘23人(共500题含答案解析)笔试必备资料历年高频考点试题摘选
评论
0/150
提交评论