Filtros de portlet
Desde el release de JSR 286: Portlet Specification 2.0, es posible interceptar y manipular la solicitud y respuesta antes de su entrega a un portlet en una fase determinada. Mediante filtros de portlet, puede bloquear la representación de un portlet si se produce una condición específica. Además, puede utilizar filtros de portlet para decorar una solicitud y una respuesta dentro de una envoltura para modificar el comportamiento del portlet.
Uso de filtros de portlet
- Implemente una o más de las interfaces siguientes del paquete javax.portlet.filter:
- RenderFilter
- ActionFilter
- ResourceFilter
- EventFilter
- Registre el filtro dentro del archivo portlet.xml para los portlets en la aplicación 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) {
//Por ejemplo, cree un javax.portlet.filter.PortletRequestWrapper aquí
}
public void destroy() {
// libere recursos
}
}
<?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
Filtros de portlet globales
El contenedor de portlets de WebSphere Application Server amplía la característica de filtro de portlet, proporcionada por JSR 286, para que pueda registrar filtros a nivel global. Estos filtros globales se aplican a todos los portlets que se ejecutan en el contenedor de portlets, incluyendo tanto portlets planos como módulos de consola.
<?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>Descripción de PortletFilterImpl global</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>

- Como los filtros de portlet globales se aplican a todos los portlets dentro del contenedor, cuando se llama al método FilterConfig#getPortletContext dentro del método init, el valor de retorno es nulo para los filtros de portlet globales.
- No confunda esta característica con los filtros de documentos de portlet de WebSphere Application Server. Los filtros de documento de portlet son, técnicamente hablando, filtros de servlet que sólo puede aplicar a la salida representada. Para obtener más información sobre los filtros de documentos de portlet, consulte la documentación sobre conversión de fragmentos de portlet a un documento HTML.
- Como los filtros de portlet globales afectan a todos los portlets que se ejecutan en un determinado contenedor de portlets, los módulos de consola que están contenidos en Integrated Solutions Console también se filtran. Es importante probar la implementación del filtro para determinar los efectos secundarios no deseados en los portlets o los módulos de la consola. Un procedimiento consiste en comprobar la vía de acceso de contexto de la solicitud en la lógica del filtro.