Portletfilter

Seit Freigabe der Spezifikation "JSR 286: Portlet Specification 2.0" haben Sie die Möglichkeit, Anforderungen und Antworten abzufangen und zu bearbeiten, bevor sie in einer bestimmten Phase an ein Portlet übergeben werden. Mit Portletfiltern können Sie die Bereitstellung eines Portlets blockieren, wenn eine bestimmte Bedingung eintritt. Außerdem können Sie Portletfilter verwenden, um eine Anforderung und eine Antwort in einem Wrapper mit Dekoratoren zu versehen und so das Verhalten des Portlets zu ändern.

Portletfilter verwenden

Sie müssen die folgenden Aktionen ausführen, um das Feature "Portletfilter" nutzen zu können:
  • Implementieren Sie eine oder mehrere der folgenden Schnittstellen des Pakets javax.portlet.filter:
    • RenderFilter
    • ActionFilter
    • ResourceFilter
    • EventFilter
    Sie müssen den passenden Filter basierend auf der Methode oder Phase des zu filternden Portlets implementieren.
  • Registrieren Sie den Filter in der Datei portlet.xml für die Portlets in Ihrer Webanwendung.
Der folgende Beispielcode veranschaulicht einen Portletfilter zum Erfassen der Methode processAction eines Portlets:
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) {
          // Erstellen Sie z. B. einen javax.portlet.filter.PortletRequestWrapper an dieser Stelle.
     }

     public void destroy() {
          // freie Ressourcen
     }
}
Der folgende Beispielcode veranschaulicht, wie Sie den vorherigen Portletfilter in der Datei portlet.xml deklarieren können:
<?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>
Wenn Sie die Schnittstelle RenderFilter implementieren, fügen Sie beispielsweise den Code <lifecycle>RENDER_PHASE</lifecycle> zum Filterabschnitt hinzu. Diese Hinzufügung verläuft für die anderen Filterschnittstellen auf dieselbe Weise. Die folgenden Werte können für den Parameter <lifecycle> angegeben werden:
  • RESOURCE_PHASE
  • RENDER_PHASE
  • EVENT_PHASE
  • ACTION_PHASE

Globale Portletfilter

Der Portletcontainer für WebSphere Application Server erweitert das Feature Portletfilter, das von der Spezifikation JSR 286 bereitgestellt wird, und ermöglicht Ihnen die globale Registrierung von Filtern. Diese globalen Filter gelten für alle Portlets, die im Portletcontainer aktiv sind, einschließlich beider einfacher Portlets und Konsolenmodule.

Wenn Sie globale Portletfilter verwenden möchten, müssen Sie den folgenden Code zum Stammordner Ihrer JAR-Datei (Java™ Archive) oder zum Verzeichnis WEB-INF Ihrer Webanwendung hinzufügen und der Datei den Namen plugin.xml geben:
<?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>
Das Attribut order des Elements portlet-filter-config definiert, an welcher Position in der Filterkette der Filter ausgeführt werden soll. Je höher der Wert, desto später wird der Filter in der Filterkette ausgeführt. Globale Filter werden vor lokalen Portletfiltern ausgeführt.
Fehler vermeiden Fehler vermeiden:
  • Da globale Portletfilter auf alle Portlets im Container angewendet werden, ist der Rückgabewert für globale Portletfilter "0", wenn Sie die Methode FilterConfig#getPortletContext innerhalb der Methode init aufrufen.
  • Verwechseln Sie dieses Feature nicht mit den Portletdokumentfiltern für WebSphere Application Server. Diese Portletdokumentfilter sind, technisch betrachtet, Servletfilter, die Sie nur auf die bereitgestellte Ausgabe anwenden können. Weitere Informationen zu den Portletdokumentfiltern finden Sie in der Dokumentation zur Konvertierung von Portletfragmenten in ein HTML-Dokument.
  • Da globale Portletfilter Auswirkungen auf alle Portlets haben, die im betreffenden Portletcontainer ausgeführt werden, werden auch die Konsolenmodule, die in Integrated Solutions Console enthalten sind, gefiltert. Es ist daher wichtig, dass Sie Ihre Filterimplementierung testen, um festzustellen, ob in Konsolenmodulen oder Portlets unerwünschte Nebeneffekte auftreten. Eine Methode, dies zu tun, besteht darin, den Kontextpfad der Anforderung in Ihrer Filterlogik zu testen.
gotcha

Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cport_portlet_filters
Dateiname:cport_portlet_filters.html