Portlet preferences
Preferences are set by portlets to store customized information. By default, the PortletServingServlet servlet stores the portlet preferences for each portlet window in a cookie. However, we can change the location to store them in either a session, an .xml file, or a database.
Storing portlet preferences in cookies
The attributes of the cookie are defined as follows:
- Path
- context/portlet-name/portletwindow
- Name:
- The name of the cookie has the fixed value of PortletPreferenceCookie.
- Value
- The value of the cookie contains a list of preferences by mapping to the following structure:
*['/' pref-name *['=' pref-value]]
- All preferences start with '/' followed by the name of the preference. If the preference has one or more values, the values follow the name separated by the '=' character. A null value is represented by the string '#*!0_NULL_0!*#'. As an example, the cookie value may look like, /locations=raleigh=boeblingen/regions=nc=bw
Customize the portlet preferences storage
You can override how the cookie is handled to store preferences in a session, an .xml file or database. To customize the storage, create a filter, servlet or JavaServer Pages file as new entry point that wraps the request and response before calling the portlet. Examine the following example wrappers to understand how to change the behavior of the PortletServingServlet to store the preferences in a session instead of cookies.
The following is an example of how the main servlet manages the portlet invocation.
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); } }In the following example, the request wrapper changes the cookie handling to retrieve the preferences out of the session.
public class RequestWrapper extends HttpServletRequestWrapper { ... public Cookie[] getCookies() { Cookie[] cookies = (Cookie[]) session.getAttribute("SessionPreferences"); return cookies; } }In the following example, the response wrapper changes the cookie handling to store the preferences in the session:
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; } }
Related:
Portlet aggregation using JavaServer Pages Portlets Portlet container JSR-000168 Portlet Specification