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
- Implemente uma ou mais das seguintes interfaces do pacote javax.portlet.filter:
- RenderFilter
- ActionFilter
- ResourceFilter
- EventFilter
- Registre o filtro dentro do arquivo portlet.xml para os portlets em seu aplicativo da 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) {
//For example, create a javax.portlet.filter.PortletRequestWrapper here
}
public void destroy() {
// free resources
}
}
<?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 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.
<?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>

- 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.