Maison >Java >javaDidacticiel >Explication détaillée d'exemples de filtres, d'écouteurs et d'intercepteurs en Java

Explication détaillée d'exemples de filtres, d'écouteurs et d'intercepteurs en Java

零下一度
零下一度original
2017-06-25 13:32:382536parcourir

1. Filtre

Le filtre est également appelé filtre. C'est la technologie la plus pratique de la technologie Servlet. Les développeurs Web utilisent la technologie Filter pour gérer toutes les ressources Web gérées par le serveur Web : telles que Jsp, Servlets, les fichiers d'images statiques ou les fichiers HTML statiques sont interceptés pour réaliser certaines fonctions spéciales. Par exemple, certaines fonctions avancées telles que le contrôle d'accès aux autorisations au niveau des URL, le filtrage du vocabulaire sensible et la compression des informations de réponse peuvent être implémentées.

Il est principalement utilisé pour pré-traiter les demandes des utilisateurs et peut également post-traiter HttpServletResponse. Le processus complet d'utilisation de Filter : Filter prétraite la demande de l'utilisateur, puis transmet la demande à Servlet pour traitement et génère une réponse, et enfin Filter post-traite la réponse du serveur.

est généralement utilisé avec l'architecture Spring aux endroits suivants :

1.1 Pour résoudre le problème d'écriture de caractères dans le problème d'encodage de la base de données, configurez le code dans web.xml

 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>
Afficher le code

1.2 Résoudre le problème de chargement séquentiel d'initialisation qui se produit lors de l'intégration avec mongodb et utiliser Filter pour compléter la fonction proxy

 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>
Afficher le code
过滤器生命周期的四个阶段:
<span style="font-size: 14px">1、实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。</span><br><span style="font-size: 14px">2、初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。</span>
3、过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。
4、销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。

 

二、监听器

监听器Listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

Listener是Servlet的监听器,可以监听客户端的请求和服务端的操作等。

主要有以下三类:

1、ServletContext监听

ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。

2、Session监听

Session属于http协议下的内容,接口位于javax.servlet.http.*包下。

HttpSessionListener接口:对Session的整体状态的监听。
HttpSessionAttributeListener接口:对session的属性监听。
session的销毁有两种情况:

2.1 session超时,web.xml配置: <session-config> <session-timeout>120session-timeout>

session-config>   

2.2 手工使session失效 public void invalidate();//使session失效方法。session.invalidate();

3、Request监听

ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。

4、在web.xml中配置

Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,

而销毁比Servlet和Filter都慢。

<listener> <listener-class>com.listener.classlistener-class> listener>

<context-param> <param-name>contextConfigLocationparam-name>

<param-value>classpath:spring/applicationContext-*.xmlparam-value>

context-param>

<

auditeur>

  <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class> 🎜>

auditeur> 4. 1 Spring utilise IntrospectorCleanupListener pour nettoyer le cache La fonction de cet écouteur est de rafraîchir le cache Introspector des JavaBeans du JDK lorsque l'application Web est fermée pour garantir que le chargeur de classe de l'application Web et le les classes qu'il charge sont libérées correctement. Si JavaBeans Introspector a été utilisé pour analyser les classes d'application, le cache Introspector à l'échelle du système contiendra une référence matérielle à ces classes. Par conséquent, ces classes et le chargeur de classes de l'application Web ne seront pas récupérés par le garbage collector lorsque l'application Web est fermée ! IntrospectorCleanupListener le nettoiera de manière appropriée afin qu'il puisse être recyclé par le ramasse-miettes. La seule façon de nettoyer Introspector est de vider tout le cache d'Introspector, il n'y a pas d'autre moyen de spécifier exactement à quelle classe l'application fait référence. Cela supprimera les résultats Introspector mis en cache de toutes les autres applications sur le serveur. Lors de l'utilisation du mécanisme de bean interne de Spring, il n'est pas nécessaire d'utiliser cet écouteur, car le propre cache des résultats d'introspection de Spring actualisera immédiatement le cache JavaBeans Introspector analysé et actualisera uniquement le cache JavaBeans Introspector analysé dans celui de l'application. ClassLoader Il y a un cache à l'intérieur. Bien que Spring lui-même ne génère pas de fuites, notez que même dans les cas où les classes du framework Spring elles-mêmes résident dans un chargeur de classe « commun » (tel que le ClassLoader du système), IntrospectorCleanupListener doit toujours être utilisé. Dans ce cas, cet IntrospectorCleanupListener nettoiera correctement le cache d'introspection de Spring. Les classes d'application ont rarement besoin d'utiliser JavaBeans Introspector directement, ce n'est donc généralement pas la ressource Introspector qui provoque des fuites de mémoire. En revanche, de nombreuses bibliothèques et frameworks, tels que Struts et Quartz, ne nettoient pas Introspector. Il est à noter qu'une simple fuite d'Introspector entraînera le non-recyclage du chargeur de classe de l'ensemble de l'application web ! Le résultat sera que lorsque l'application Web sera fermée, toutes les ressources de classe statiques (telles que les objets à instance unique) de l'application ne seront pas libérées. La cause première des fuites de mémoire ne vient pas réellement de ces classes non recyclées ! Remarque : IntrospectorCleanupListener doit être enregistré en tant que premier écouteur dans web.xml, avant tout autre écouteur, comme avant ContextLoaderListener de Spring, pour garantir que IntrospectorCleanupListener prend effet au moment approprié dans le cycle de vie de l'application Web.

<

auditeur>

 

<

listener-class>org.springframework.web.util.IntrospectorCleanupListenerlistener-class>

auditeur>

3. intercepteur à ressort

Les intercepteurs gérés par Spring doivent hériter Intercepter implémente HandlerInterceptor

Pour entrer dans l'intercepteur, vous devez d'abord configurer l'entrée du ressort


org.springframework.web.servlet. DispatcherServlet


 spring
/

La méthode d'écriture ci-dessus ne filtrera pas les URL se terminant par .jsp, si vous devez traiter .jsp, vous devez utiliser filtres, ou utiliser l'architecture shiro

Mais pour les ressources statiques générales, nous n'avons pas besoin de filtrer et d'intercepter, vous pouvez utiliser la configuration suivante

configuration web.xml

< ;servlet-mapping>

​ ​ ​default
pattern>*.js
/image /*


configuration spring-servlet .xml, faites attention à l'ajout du fichier d'en-tête

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn