您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > Servlet过滤器和监听器
Servlet过滤器和监听器1过滤器的定义过滤器是一个服务器端的组件,它主要用于客户端(浏览器)的请求进行过滤处理,再将过滤后的请求转发到下一资源,他在JSP网站开发中具有非常重要的作用。过滤器实质就是在Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)对目标资源的请求,并对这些请求进行处理再发给目标资源。过滤器拦截请求,不是禁止访问,相应处理后,还会转到目标地址所拦截的请求路径可以是servlet或者是某个页面路径/index.jsp等过滤器拦截servlet或者jsp页面内容,比如内容替换,再向用户展现修改后的页面过滤源—过滤规则—-过滤结果观看一个视频网站时,对于同一个网页地址,登录过的用户,直接能观看,未登录的用户,则跳转到登录界面访问一个页面时,该页面无法加载或不存在,可以过滤请求,返回一个错误页2过滤器的工作原理没有过滤器,用户直接访问资源。3过滤器两种配置方法过滤器和Servlet十分类似,都需要进行配置,在Servlet3.0中,提供了采用注解的方式配置过滤器,如:@WebFilter(filterName=FirstFilter,urlPatterns=/*,initParams={@WebInitParam(name=mood,value=awake)})urlPatterns属性:用于指定那些URL应用该过滤器。如果指定所有页面均应用该过滤器可以设置为“/*”。initParams属性用于指定初始化参数在web.xml文件中配置filterfilter-nameFirstFilter/filter-namefilter-classfilter.FirstFilter/filter-class/filterfilter-mappingfilter-nameFirstFilter/filter-nameurl-pattern/*/url-pattern/filter-mappingfilter指定一个过滤器。filter-name用于为过滤器指定一个名字,该元素的内容不能为空。filter-class元素用于指定过滤器的完整的限定类名。init-param元素用于为过滤器指定初始化参数,它的子元素param-name指定参数的名字,param-value指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。filter-mapping元素用于设置一个Filter所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet名称和资源访问的请求路径filter-name子元素用于设置filter的注册名称。该值必须是在filter元素中声明过的过滤器的名字url-pattern设置filter所拦截的请求路径(过滤器关联的URL样式)FirstFilter.Java//packagefiletr;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter;/***ServletFilterimplementationclassFirstFilter*/@WebFilter(/*)//采用注解的方式publicclassFirstFilterimplementsFilter{/***Defaultconstructor.*/publicFirstFilter(){//TODOAuto-generatedconstructorstub}/***@seeFilter#destroy()*/publicvoiddestroy(){//TODOAuto-generatedmethodstub}/***@seeFilter#doFilter(ServletRequest,ServletResponse,FilterChain)*/publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//TODOAuto-generatedmethodstub//placeyourcodehere//passtherequestalongthefilterchainchain.doFilter(request,response);}/***@seeFilter#init(FilterConfig)*/publicvoidinit(FilterConfigfConfig)throwsServletException{//TODOAuto-generatedmethodstub}}init()过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法,这个方法可以获取web.xml文件中的过滤器参数。doFilter()完成实际的过滤操作。过滤器的核心方法,当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的doFilter方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求转发到其他资源。destroy()Web容器在销毁过滤器实例前调用该方法,可以释放过滤器占用的资源。(大多数情况下用不到)4过滤器示例FilterConfig使用Filter的init方法中提供了一个FilterConfig对象。如web.xml文件配置如下:filterfilter-nameLoginFilter/filter-namefilter-classcom.runoob.test.LogFilter/filter-classinit-paramparam-nameSite/param-nameparam-value菜鸟教程/param-value/init-param/filter在init方法使用FilterConfig对象获取参数:publicvoidinit(FilterConfigconfig)throwsServletException{//获取初始化参数Stringsite=config.getInitParameter(Site);//输出初始化参数System.out.println(网站名称:+site);}示例利用过滤器,实现网站访问计数器的功能,并在配置过滤器时,将网站访问的初始值设置为1000.每一次访问页面,都会通过过滤器,过滤器里使count值每次加一,达到计数器的效果。%@pagelanguage=javacontentType=text/html;charset=UTF-8pageEncoding=UTF-8%!DOCTYPEhtmlhtmlheadmetacharset=UTF-8title主界面/title/headbodyh2欢迎光临,br您是本站的第【%=application.getAttribute(count)%】位访客!/h2/body/htmlCountFilter.java//packagecom.mingrisoft;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.http.HttpServletRequest;/***Servlet过滤器实现类CountFilter*/@WebFilter(urlPatterns={/index.jsp},initParams={@WebInitParam(name=count,value=1000)})publicclassCountFilterimplementsFilter{privateintcount;//来访数量/***默认构造方法*/publicCountFilter(){System.out.println(CountFilter的构造方法....);}/***销毁方法*/publicvoiddestroy(){System.out.println(CountFilter的destroy....);}/***过滤处理方法*/publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{count++;//访问数量自增//将ServletRequest转换成HttpServletRequestHttpServletRequestreq=(HttpServletRequest)request;//获取ServletContextServletContextcontext=req.getServletContext();context.setAttribute(count,count);//将来访数量值放入到ServletContext中System.out.println(CountFilter的start....);chain.doFilter(request,response);//向下传递过滤器System.out.println(CountFilter的end....);}/***@seeFilter#init(FilterConfig)*/publicvoidinit(FilterConfigfConfig)throwsServletException{System.out.println(CountFilter的init....);Stringparam=fConfig.getInitParameter(count);//获取初始化参数count=Integer.valueOf(param);//将字符串转换为int}}第一次启动index.jspCountFilter的构造方法....CountFilter的init....CountFilter的start....CountFilter的end....刷新一次index.jsp页面,执行一次doFilter()CountFilter的start....CountFilter的end....5Servlet监听器Servlet监听器可以监听到在特定事件发生的事件,并根据其做出相应的反应。监听器的作用是监听Web容器的有效期事件,因此它是由容器管理的。利用Listener接口监听在容器中的某个执行程序,并且根据应用程序的需求做出适当的响应。下表列出了
本文标题:Servlet过滤器和监听器
链接地址:https://www.777doc.com/doc-2858206 .html