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

Para utilizar la característica de filtros de portlet, antes debe realizar las acciones siguientes:
  • Implemente una o más de las interfaces siguientes del paquete javax.portlet.filter:
    • RenderFilter
    • ActionFilter
    • ResourceFilter
    • EventFilter
    Debe implementar el filtro adecuado en función del método o fase del portlet que desea filtrar.
  • Registre el filtro dentro del archivo portlet.xml para los portlets en la aplicación web.
El código de ejemplo siguiente ilustra un filtro de portlet destinado al método processAction de un portlet:
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
     }
}
El código de ejemplo siguiente ilustra cómo puede declarar el filtro de portlet anterior en el archivo portlet.xml:
<?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>
Si implementa la interfaz RenderFilter, por ejemplo, añada el código <lifecycle>RENDER_PHASE</lifecycle> a la sección de filtro. Esta adición es similar a las otras interfaces de filtro. Los siguientes valores son válidos para el parámetro <lifecycle>:
  • 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.

Para utilizar los filtros de portlet globales, añada el siguiente código a la carpeta raíz del archivo JAR (Java™ Archive) o al directorio WEB-INF de la aplicación web con el nombre de archivo plugin.xml:
<?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>
El atributo order del elemento portlet-filter-config define cuándo se ejecuta el filtro en la cadena de filtros. Cuanto mayor sea el valor, más tarde se ejecuta el filtro en la cadena de filtros. Los filtros globales se desencadenan antes de que los filtros de portlet locales.
Avoid trouble Avoid trouble:
  • 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.
gotcha

Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cport_portlet_filters
File name: cport_portlet_filters.html