Filter简介Filter又叫过滤器,是Servlet技术中最实用的技术。WEB开发者利用Filter技术对所有由web服务器管理的web资源:如Jsp、Servlet、静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现了URL级别的权限访问控制、敏感词过滤、响应信息压缩等高级功能。主要用于预处理用户请求,也可以对HttpServletResponse进行后处理。使用Filter的完整过程:Filter对用户请求进行预处理,然后将请求传递给Servlet进行处理并生成响应,***Filter对服务器响应进行后处理。Filter函数在HttpServletRequest到达Servlet之前拦截客户端的HttpServletRequest。根据需要检查HttpServletRequest,并修改HttpServletRequest标头和数据。在HttpServletResponse到达客户端之前拦截HttpServletResponse。根据需要检查HttpServletResponse,并修改HttpServletResponse标头和数据。如何使用Filter实现拦截功能Filter接口中有一个doFilter方法。开发者在编写Filter并配置拦截哪个web资源时,WEB服务器每次调用该web资源的service方法前都会先调用filter。doFilter方法,因此,在该方法中编写代码可以达到以下目的:让一段代码在调用目标资??源之前执行。是否调用目标资??源(即是否让用户访问web资源)。当web服务器调用doFilter方法时,会传入一个filterChain对象,filterChain对象是filter接口中最重要的对象。它还提供了一个doFilter方法。开发者可以根据自己的需要决定是否调用该方法。调用该方法,则web服务器会调用web资源的service方法,即访问web资源,否则不访问web资源。Filter开发分两步写一个java类实现Filter接口并实现其doFilter方法。使用web.xml文件中的和元素来注册编写的过滤器类,并设置它可以拦截的资源。web.xml配置各节点介绍:指定一个过滤器。用于为过滤器指定一个名称,该元素的内容不能为空。元素用于指定过滤器的完全限定类名。元素用于指定过滤器的初始化参数,其子元素指定参数的名称,指定参数的值。在过滤器中,您可以使用FilterConfig接口对象来访问初始化参数。元素用于设置一个Filter负责拦截的资源。Filter拦截的资源可以通过两种方式指定:Servlet名称和访问资源的请求路径。子元素用于设置过滤器的注册名称。该值必须是元素中声明的过滤器的名称。设置过滤器拦截的请求路径(过滤器关联的URLpattern)指定过滤器拦截的Servlet名称。指定过滤器拦截的资源如何被Servlet容器调用。可以是REQUEST、INCLUDE、FORWARD、ERROR其中之一,默认为REQUEST。用户可以设置多个子元素来指定Filter拦截对资源的多次调用。子元素可以设置值及其含义REQUEST:当用户直接访问页面时,web容器会调用过滤器。如果通过RequestDispatcher的include()或forward()方法访问目标资源,则不会调用过滤器。INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问的,那么过滤器就会被调用。否则,过滤器将不会被调用。FORWARD:如果通过RequestDispatcher的forward()方法访问目标资源,则调用过滤器,否则不调用过滤器。错误:如果通过声明性异常处理机制调用目标资??源,则将调用此过滤器。否则,过滤器将不会被调用。过滤器链在一个web应用中,可以开发和编写多个过滤器,这些过滤器的组合称为过滤器链。Web服务器根据Filter在web.xml文件中的注册顺序决定先调用哪个Filter。当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象,并将其传递给该方法。在doFilter方法中,如果开发者调用了FilterChain对象的doFilter方法,Web服务器会检查FilterChain对象中是否有过滤器,如果有则调用第二个过滤器,如果没有则调用目标资??源。Filter的生命周期publicvoidinit(FilterConfigfilterConfig)throwsServletException;//初始化和我们写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。当web应用启动时,web服务器会创建一个Filter的实例对象,调用它的init方法,读取web.会创建一次,init方法只会执行一次)。开发者可以通过init方法的参数获取代表当前过滤器配置信息的FilterConfig对象。publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException;//拦截请求该方法完成实际的过滤操作。当客户端请求访问与过滤器关联的URL时,Servlet过滤器将首先执行doFilter方法。FilterChain参数用于访问后续过滤器。publicvoiddestroy();//被销毁的Filter对象创建后会驻留在内存中,当web应用被移除或服务器停止时会被销毁。在Web容器卸载Filter对象之前调用。该方法在Filter的生命周期中只执行一次。在这个方法中,可以释放过滤器使用的资源。在配置FilterConfig接口时,用户可以为过滤器配置一些初始化参数。Web容器在实例化Filter对象并调用其init方法时,会传入封装了过滤器初始化参数的filterConfig对象。因此,开发者在编写过滤器时,可以通过filterConfig对象的方法获取如下内容:StringgetFilterName();//获取过滤器的名称。StringgetInitParameter(Stringname);//返回部署描述中指定名称的初始化参数的值。如果没有returnnull.EnumerationgetInitParameterNames();//返回过滤器所有初始化参数名称的枚举集合。publicServletContextgetServletContext();//返回对Servlet上下文对象的引用。Filter用例使用Filter验证用户登录安全控制前段时间参与维护一个项目,用户退出系统后,去地址栏访问历史记录,根据url,仍然可以进入系统响应页面。我去查看,发现没有过滤请求来验证用户登录。添加过滤器解决问题!首先在web.xml中配置SessionFiltercom.action.login.SessionFilterlogonStrings/project/index.jsp;login.doincludeStrings.do;.jspredirectPath/index.jspdisabletestfilterNSessionFilter/*编码org.springframework.web.filter.CharacterEncodingFilter编码UTF-8forceEncodingfalseencoding/*Spring+Hibernate的OpenSessionInViewFilter控制session的切换。hibernate+spring一起使用时,如果设置了lazy=true(懒加载),那么在读取数据的时候,读取父数据后,hibernate会自动关闭session,所以,当你想使用关联数据和子数据时数据,系统会抛出lazyinit错误,这时需要使用spring提供的OpenSessionInViewFilter过滤器。OpenSessionInViewFilter主要是保持Session状态,直到请求把所有的页面发送给客户端,直到请求结束才关闭session,这样就可以解决延迟加载带来的问题。注意:OpenSessionInViewFilter的配置要写在struts2配置的前面。因为tomcat容器是按顺序加载过滤器的,如果配置文件先写struts2过滤器配置,再写OpenSessionInViewFilter过滤器配置,那么加载顺序导致action获取数据。不受弹簧管理。OpenSessionInViewFilterorg.springframework.orm.hibernate3.support.OpenSessionInViewFiltersessionFactoryBeanNamesessionFactorysingleSessiontrueOpenSessionInViewFilter*.do在Struts2的web.xml配置项目中使用Struts2也需要在web.xml中配置filter拦截请求并传递给ActionStruts2的处理。注意:如果Struts2版本在2.1.3之前,过滤器使用org.apache.struts2.dispatcher.FilterDispatcher。否则使用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。从Struts2.1.3开始,ActionContextCleanUp过滤器将被丢弃,相应的功能将包含在StrutsPrepareAndExecuteFilter过滤器中。三个初始化参数配置:config参数:指定要加载的配置文件。被逗号隔开。actionPackages参数:指定Action类所在的包空间。被逗号隔开。configProviders参数:自定义配置文件提供者,需要实现ConfigurationProvider接口类。被逗号隔开。struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2*.do