Filtres de portlet
Depuis l'édition de JSR 286: Portlet Specification 2.0, il est possible d'intercepter et de manipuler la demande et la réponse avant leur distribution vers un portlet dans une phase donnée. En utilisant des filtres de portlet, vous pouvez bloquer le rendu d'un porlet dans un cas donné. Vous pouvez également utiliser des filtres de portlet pour décorer une demande et une réponse dans un encapsuleur pour modifier le comportement du portlet.
Utilisation des filtres de portlet
- Implémenter une ou plusieurs des interfaces suivantes du package javax.portlet.filter :
- RenderFilter
- ActionFilter
- ResourceFilter
- EventFilter
- Enregistrez le filtre dans le fichier portlet.xml pour les portlets de votre application Web
package my.pkg;
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.filter.ActionFilter;
import javax.portlet.filter.FilterChain;
import javax.portlet.filter.FilterConfig;
public class MyPortletFilter implements ActionFilter {
public void init(FilterConfig config) throws PortletException {
String myInitParameter = config.getInitParameter("myInitParameter");
// ...
}
public void doFilter(ActionRequest request, ActionResponse response,
FilterChain chain) throws IOException, PortletException {
preProcess(request, response);
chain.doFilter(request, response);
postProcess (request, response);
}
private void preProcess(ActionRequest request, ActionResponse response) {
//Par exemple, créer un javax.portlet.filter.PortletRequestWrapper ici
}
public void destroy() {
// libérer les ressources
}
}
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
version="2.0" id="demo_app_id">
<portlet>
<portlet-name>MyPortlet1</portlet-name>
<!-- [...] -->
</portlet>
<portlet>
<portlet-name>MyPortlet2</portlet-name>
<!-- [...] -->
</portlet>
<filter>
<filter-name>PortletFilter</filter-name>
<filter-class>my.pkg .MyPortletFilter</filter-class>
<lifecycle>ACTION_PHASE</lifecycle>
<init-param>
<name>myInitParameter</name>
<value>myValue</value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PortletFilter</filter-name>
<portlet-name>MyPortlet1</portlet-name>
<portlet-name>MyPortlet2</portlet-name>
</filter-mapping>
</portlet-app>
- RESOURCE_PHASE
- RENDER_PHASE
- EVENT_PHASE
- ACTION_PHASE
Filtres de portlet globaux
Le conteneur de portlet pour WebSphere Application Server étend la fonction de filtre de portlet fournie par JSR 286 pour vous permettre d'enregistrer des filtres à un niveau global. Ces filtres globaux s'appliquent à tous les portlets exécutés dans le conteneur de portlet, y compris aux portlets ordinaires et aux modules de console.
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin id="portlet-filter-config" name="WS_Server" provider-name="IBM"
version="1.0.0">
<extension point="com.ibm.ws.portletcontainer.portlet-filter-config">
<portlet-filter-config class-name="my.pkg.PortletFilter" order="22000">
<description>Description of global PortletFilterImpl</description>
<lifecycle>ACTION_PHASE</lifecycle>
<lifecycle>EVENT_PHASE</lifecycle>
<lifecycle>RENDER_PHASE</lifecycle>
<lifecycle>RESOURCE_PHASE</lifecycle>
<init-param>
<name>MyInitParam1</name>
<value>MyInitValue1</value>
</init-param>
<init-param>
<name>MyInitParam2</name>
<value>MyInitValue2</value>
</init-param>
</portlet-filter-config>
</extension>
</plugin>

- Comme les filtres de portlet globaux s'appliquent à tous les portlets dans le conteneur, lorsque vous appelez la méthode FilterConfig#getPortletContext dans la méthode init, la valeur de retour est null pour les filtres de portlet globaux.
- Ne confondez pas cette fonction avec les filtres de document de portlet de WebSphere Application Server. Ces filtres sont, d'un point de vue technique, des filtres de servlet que vous pouvez appliquer à une sortie de rendu uniquement. Pour plus d'informations sur les filtres de document de portlet, voir la documentation sur la conversion des fragments de portlet en document HTML.
- Comme les filtres de portlet globaux affectent tous les portlets exécutés dans le conteneur de portlet défini, les modules de console qui se trouvent dans la console ISC (Integrated Solutions Console) sont également filtrés. Il est important de tester l'implémentation de filtre pour identifier les conséquences indésirables sur les modules de console ou les portlets. Une méthode de test consiste à vérifier le chemin de contexte de la demande dans la logique du filtre.