Filtros de Portlet

Desde a liberação de JSR 286: Portlet Specification 2.0, é possível interceptar e manipular a solicitação e a resposta antes que sejam entregues a um portlet em uma determinada fase. Usando Filtros de Portlet é possível bloquear a renderização de um portlet se ocorrer uma condição específica. Além disso, é possível usar filtros de portlet para decorar uma solicitação e uma resposta dentro de um wrapper para modificar o comportamento do portlet.

Uso do Filtro de Portlet

Para usar o recurso de filtro de portlet, primeiro você deve concluir as seguintes ações:
  • Implemente uma ou mais das seguintes interfaces do pacote javax.portlet.filter:
    • RenderFilter
    • ActionFilter
    • ResourceFilter
    • EventFilter
    Você deve implementar o filtro apropriado com base no método ou fase do portlet que deseja filtrar.
  • Registre o filtro dentro do arquivo portlet.xml para os portlets em seu aplicativo da Web.
A amostra a seguir ilustra um filtro de portlet para exibir o método processAction de um 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) {
          //For example, create a javax.portlet.filter.PortletRequestWrapper here
     }

     public void destroy() {
          // free resources
     }
}
O código de amostra a seguir ilustra como é possível declarar o filtro de portlet anterior no arquivo 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>
Se você implementar a interface RenderFilter, por exemplo, inclua o código <lifecycle>RENDER_PHASE</lifecycle> para a seção de filtro. Essa inclusão é análoga às outras interfaces de filtro. Os valores a seguir são válidos para o parâmetro <lifecycle>:
  • RESOURCE_PHASE
  • RENDER_PHASE
  • EVENT_PHASE
  • ACTION_PHASE

Filtros de Portlet Global

O contêiner de portlet para o WebSphere Application Server estende o recurso de filtro de portlet, que é fornecido pela JSR 286, para permitir que você registre filtros em um nível global. Esses filtros globais se aplicam a todos os portlets em execução dentro do contêiner de portlet, incluindo portlets simples e módulos de console.

Para usar filtros de portlets globais, inclua o seguinte código para a pasta-raiz de seu arquivo Java™ archive (JAR) ou no diretório WEB-INF de seu aplicativo da Web e o denomine como arquivo 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>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>
O atributo order do elemento portlet-filter-config define quando executar o filtro na cadeia de filtros. Quanto mais alto o valor, mais tarde o filtro é executado na cadeia de filtros. Os filtros globais são acionados antes dos filtros de portlets locais.
Evitar Problemas Evitar Problemas:
  • Como os filtros de portlets globais são aplicados em todos os portlets dentro do contêiner, ao chamar o método FilterConfig#getPortletContext dentro do método init, o valor de retorno é nulo para filtros de portlets globais.
  • Não confunda este recurso com os filtros de documentos de portlets para o WebSphere Application Server. Esses filtros de documentos de portlets são, tecnicamente falando, filtros de servlets que podem ser aplicados apenas para saída renderizada. Para obter informações adicionais sobre filtros de documentos de portlets, consulte a documentação sobre a conversão de fragmentos de portlets para um documento HTML.
  • Como os filtros de portlets globais afetam todos os portlets em execução no contêiner de portlet fornecido, os módulos de console que estão contidos no Integrated Solutions Console também são filtrados. É importante testar sua implementação de filtro para obter os efeitos colaterais indesejados nos módulos de console ou portlets. Uma abordagem é testar verificando o caminho de contexto da solicitação em sua lógica de filtro.
gotcha

Ícone que indica o tipo de tópico Tópico de Conceito



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cport_portlet_filters
Nome do arquivo: cport_portlet_filters.html