設定は、ポートレットによって設定され、カスタマイズ情報に保管されます。 デフォルトでは、PortletServingServlet サーブレットが、各ポートレット・ウィンドウのポートレットの設定を Cookie に保管します。 しかし、それらの設定を保管する場所は、セッション、.xml ファイル、 またはデータベースのいずれかに変更することができます。
Cookie を処理する方法をオーバーライドして、設定をセッション、 .xml ファイル、またはデータベースに保管できます。 保管をカスタマイズするには、 ポートレットを呼び出す前に、要求と応答をラップする新規エントリー・ポイントとして、 フィルター、サーブレットまたは JavaServer Pages ファイルを作成する必要があります。 設定を Cookie ではなくセッションに保管するように PortletServingServlet の振る舞いを変更する方法を理解するために、 以下のサンプル・ラッパーを検討します。
public class DispatchServlet extends HttpServlet { ... public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); // create wrappers to change preference storage RequestProxy req = new RequestProxy(request); ResponseProxy resp = new ResponseProxy(request, response); // create url prefix to always return to this servlet ... req.setAttribute("com.ibm.wsspi.portlet.url.prefix", urlPrefix); // prepare portlet url String portletPath = request.getPathInfo(); ... // include portlet using wrappers RequestDispatcher rd = getServletContext().getRequestDispatcher(modifiedPortletPath); rd.include(req, resp); } }
public class RequestWrapper extends HttpServletRequestWrapper { ... public Cookie[] getCookies() { Cookie[] cookies = (Cookie[]) session.getAttribute("SessionPreferences"); return cookies; } }
public class ResponseProxy extends HttpServletResponseWrapper { ... public void addCookie(Cookie cookie) { Cookie[] oldCookies = (Cookie[]) session.getAttribute("SessionPreferences"); int newPos = (oldCookies == null) ? 0 : oldCookies.length; Cookie[] newCookies = new Cookie[newPos+1]; session.setAttribute("SessionPreferences", newCookies); if (oldCookies != null) { System.arraycopy(oldCookies, 0, newCookies, 0, oldCookies.length); } newCookies[newPos] = cookie; } }