1、过滤器css
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员经过Filter技术,对web服务器管理的全部web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。html
它主要用于对用户请求进行预处理,也能够对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。java
通常与spring架构一块儿用在如下几个地方:web
1.1 处理字符写入数据库编码问题,在web.xml中配置一下代码spring
1 <filter> 2 <filter-name>Encoding</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>utf-8</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>Encoding</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>
1.2 处理与mongodb整合出现的初始化前后加载问题,使用Filter完成代理功能mongodb
1 <!-- 告诉ContextLoaderListener叫在spring的配置文档的位置--> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value> 5 classpath:spring-shiro-web.xml, 6 /WEB-INF/spring-servlet.xml 7 </param-value> 8 </context-param> 9 10 <filter> 11 <filter-name>shiroFilter</filter-name> 12 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 13 <init-param> 14 <param-name>targetFilterLifecycle</param-name> 15 <param-value>true</param-value> 16 </init-param> 17 </filter> 18 <!-- Make sure any request you want accessible to Shiro is filtered. /* catches all --> 19 <!-- requests. Usually this filter mapping is defined first (before all others) to --> 20 <!-- ensure that Shiro works in subsequent filters in the filter chain: --> 21 <filter-mapping> 22 <filter-name>shiroFilter</filter-name> 23 <url-pattern>/*</url-pattern> 24 </filter-mapping> 25 26 <!-- 在tomcat启动的时候优先加载spring的配置文档 --> 27 <listener> 28 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 29 </listener>
过滤器生命周期的四个阶段:
一、实例化:Web容器在部署Web应用程序时对全部过滤器进行实例化。Web容器回调它的无参构造方法。
二、初始化:实例化完成以后,立刻进行初始化工做。Web容器回调init()方法。
三、过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工做方法。
四、销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。
2、监听器数据库
监听器Listener就是在application,session,request三个对象建立、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。缓存
Listener是Servlet的监听器,能够监听客户端的请求和服务端的操做等。tomcat
主要有如下三类:服务器
Session属于http协议下的内容,接口位于javax.servlet.http.*包下。
2.1 session超时,web.xml配置: <session-config> <session-timeout>120</session-timeout>
<!--session120分钟后超时销毁--> </session-config>
2.2 手工使session失效 public void invalidate();//使session失效方法。session.invalidate();
Listener配置信息必须在Filter和Servlet配置以前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,
而销毁比Servlet和Filter都慢。
<listener> <listener-class>com.listener.class</listener-class> </listener>
<context-param> <param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
<!-- 采用的是通配符方式,查找WEB-INF/spring目录下xml文件。若有多个xml文件,以“,”分隔。 -->
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这个监听器的做用是在web应用关闭时刷新JDK的JavaBeans的Introspector缓存,以确保Web应用程序的类加载器以及其加载的类正确的释放资源。
若是JavaBeans的Introspector已被用来分析应用程序类,系统级的Introspector缓存将持有这些类的一个硬引用。所以,这些类和Web应用程序的类加载器在Web应用程序关闭时将不会被垃圾收集器回收!而IntrospectorCleanupListener则会对其进行适当的清理,已使其可以被垃圾收集器回收。
惟一可以清理Introspector的方法是刷新整个Introspector缓存,没有其余办法来确切指定应用程序所引用的类。这将删除全部其余应用程序在服务器的缓存的Introspector结果。
在使用Spring内部的bean机制时,不须要使用此监听器,由于Spring本身的introspection results cache将会当即刷新被分析过的JavaBeans Introspector cache,而仅仅会在应用程序本身的ClassLoader里面持有一个cache。虽然Spring自己不产生泄漏,注意,即便在Spring框架的类自己驻留在一个“共同”类加载器(如系统的ClassLoader)的状况下,也仍然应该使用IntrospectorCleanupListener。在这种状况下,这个IntrospectorCleanupListener将会妥善清理Spring的introspection cache。
应用程序类,几乎不须要直接使用JavaBeans Introspector,因此,一般都不是Introspector resource形成内存泄露。相反,许多库和框架,不清理Introspector,例如: Struts和Quartz。
须要注意的是一个简单Introspector泄漏将会致使整个Web应用程序的类加载器不会被回收!这样作的结果,将会是在web应用程序关闭时,该应用程序全部的静态类资源(好比:单实例对象)都没有获得释放。而致使内存泄露的根本缘由其实并非这些未被回收的类!
注意:IntrospectorCleanupListener应该注册为web.xml中的第一个Listener,在任何其余Listener以前注册,好比在Spring's ContextLoaderListener注册以前,才能确保IntrospectorCleanupListener在Web应用的生命周期的适当时机生效。
<!-- memory clean -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
3、spring拦截器
spring 管理的拦截器须要继承Intercepter implements HandlerInterceptor
要进入拦截器优先须要配置spring的入口
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
以上这种写法不会过滤掉.jsp结尾的url,若须要处理.jsp须要配合过滤器使用,或者使用shiro架构
可是通常的静态资源咱们不须要过滤拦截,可使用以下配置
web.xml配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>/image/*</url-pattern>
</servlet-mapping>
spring-servlet.xml配置,注意头部文件的添加
<mvc:annotation-driven/> <mvc:default-servlet-handler/>