Portlet 过滤器
从 JSR 286: Portlet 规范 2.0 发行版开始,在给定阶段中将请求和响应传递到 portlet 之前可以对其进行拦截和操作。在发生特定情况时,可以使用 Portlet 过滤器来对 portlet 的呈现执行块操作。此外,您还可以使用 portlet 过滤器来在包装程序中修饰请求和响应,以修改 portlet 的行为。
Portlet 过滤器用法
要使用 portlet 过滤器功能部件,您必须先完成以下操作:
- 实现 javax.portlet.filter 软件包的以下一个或多个接口:
- RenderFilter
- ActionFilter
- ResourceFilter
- EventFilter
- 在 Web 应用程序中的 portlet 的 portlet.xml 文件中注册过滤器。
以下样本代码说明了 portlet 过滤器过滤 portlet 的 processAction 方法:
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
}
}
以下样本代码说明您可在 portlet.xml 文件中声明先前 portlet 过滤器的方式:
<?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>
如果实现 RenderFilter 接口,例如,将 <lifecycle>RENDER_PHASE</lifecycle> 代码添加到过滤器部分。此新增项类似于其他过滤器接口。<lifecycle> 参数的有效值如下所示:
- RESOURCE_PHASE
- RENDER_PHASE
- EVENT_PHASE
- ACTION_PHASE
全局 portlet 过滤器
WebSphere® Application Server 的 portlet 容器扩展了 JSR 286 提供的 portlet 过滤器功能部件,以使您可以在全局级别注册过滤器。这些全局过滤器适用于在 portlet 容器中运行的所有 portlet,包括纯 portlet 和控制台模块。
要使用全局 portlet 过滤器,请将以下代码添加到 Java™ 归档 (JAR) 文件的根文件夹或 Web 应用程序的 WEB-INF 目录中,并将其命名为 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>
portlet-filter-config 元素的 order 属性定义在过滤器链中运行过滤器的时间。此值越大,过滤器在过滤器链中的运行时间越晚。将在本地 portlet 过滤器之前触发全局过滤器。
避免故障:

- 由于全局 portlet 过滤器将应用于容器中的所有 portlet,因此,当您在 init 方法中调用 FilterConfig#getPortletContext 方法时,全局 portlet 过滤器的返回值为空。
- 不要将此功能部件与 WebSphere Application Server 的 portlet 文档过滤器混淆。从技术上而言,这些 portlet 文档过滤器为 servlet 过滤器,您仅可将其应用于呈现输出。有关 portlet 文档过滤器的更多信息,请参阅有关将 portlet 片段转换为 HTML 文档的文档。
- 由于全局 portlet 过滤器影响给定 portlet 容器中运行的所有 portlet,因此,也会过滤集成解决方案控制台中包含的控制台模块。务必要测试您的过滤器实现,防止对控制台模块或 portlet 产生副作用。一种方法是通过检查过滤器逻辑中的请求的上下文路径来进行测试。