Portlet 过滤器

从 JSR 286: Portlet 规范 2.0 发行版开始,在给定阶段中将请求和响应传递到 portlet 之前可以对其进行拦截和操作。在发生特定情况时,可以使用 Portlet 过滤器来对 portlet 的呈现执行块操作。此外,您还可以使用 portlet 过滤器来在包装程序中修饰请求和响应,以修改 portlet 的行为。

Portlet 过滤器用法

要使用 portlet 过滤器功能部件,您必须先完成以下操作:
  • 实现 javax.portlet.filter 软件包的以下一个或多个接口:
    • RenderFilter
    • ActionFilter
    • ResourceFilter
    • EventFilter
    您必须基于方法或要过滤的 portlet 的阶段来实现相应过滤器。
  • 在 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 产生副作用。一种方法是通过检查过滤器逻辑中的请求的上下文路径来进行测试。
gotcha

指示主题类型的图标 概念主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cport_portlet_filters
文件名:cport_portlet_filters.html