포틀릿 필터

JSR 286 릴리스 이후: Portlet Specification 2.0, 요청 및 응답이 지정된 단계(Phase)로 전달되기 전에 인터셉트 및 조작할 수 있게 되었습니다. 포틀릿 필터를 사용하여 특정 조건 발생 시에 포틀릿 렌더링을 차단할 수 있습니다. 또한, 포틀릿 필터를 사용하여 포틀릿 동작을 수정하기 위해 랩퍼 내에서 요청 및 응답을 수정할 수 있습니다.

포틀릿 필터 사용법

포틀릿 필터 기능을 사용하려면 우선 다음 조치를 완료해야 합니다.
  • javax.portlet.filter 패키지의 다음 인터페이스 중 하나 이상을 구현:
    • RenderFilter
    • ActionFilter
    • ResourceFilter
    • EventFilter
    필터링하려는 포틀릿의 메소드나 단계(Phase)에 따라 적절한 필터를 구현해야 합니다.
  • 웹 애플리케이션의 포틀릿에 대해 portlet.xml 파일에 필터를 등록하십시오.
다음 샘플 코드는 포틀릿의 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 파일에 선언하는 방법에 대해 설명합니다.
<?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

글로벌 포틀릿 필터

WebSphere® Application Server에 대한 포틀릿 컨테이너는 JSR 286에서 제공되는 포틀릿 필터 기능을 확장하여 필터를 글로벌 레벨에 등록하도록 합니다. 이 글로벌 필터는 포틀릿 컨테이너에서 실행 중인 모든 포틀릿에 적용되며 여기에는 일반 포틀릿과 콘솔 모듈 모두 포함됩니다.

글로벌 포틀릿 필터를 사용하려면 다음 코드를 JAR(Java™ archive) 파일 또는 웹 애플리케이션의 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 속성은 필터 체인에서 필터 실행 시기를 정의합니다. 값이 클수록 필터가 필터 체인에서 늦게 실행됩니다. 글로벌 필터는 로컬 포틀릿 필터 전에 트리거됩니다.
문제점 방지 문제점 방지:
  • 글로벌 포틀릿 필터가 컨테이너 내의 모든 포틀릿에 적용되기 때문에 FilterConfig#getPortletContext 메소드를 init 메소드 내에서 호출하면 리턴 값은 글로벌 포틀릿 필터에 대해 널입니다.
  • 이 기능은 WebSphere Application Server에 대한 포틀릿 문서 필터와 혼동하지 마십시오. 기술적으로 말해서 해당 포틀릿 문서 필터는 렌더링된 출력에만 적용할 수 있는 서블릿 필터입니다. 포틀릿 문서 필터에 대한 자세한 정보는 포틀릿 단편을 HTML 문서로 변환에 대한 문서를 참조하십시오.
  • 글로벌 포틀릿 필터가 지정된 포틀릿 컨테이너에서 실행 중인 모든 포틀릿에 영향을 주기 때문에 통합 솔루션 콘솔에 포함된 콘솔 모듈도 필터링됩니다. 콘솔 모듈이나 포틀릿에서 바람직하지 않은 부작용에 대해 필터 구현을 테스트하는 것도 중요합니다. 필터 로직에서 요청의 컨텍스트 경로를 검사하여 테스트하는 것도 한 가지 방법입니다.
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