Accès à la session de portlet sur la page anonyme
Consultez quelques indications sur la gestion des sessions de portlet lorsque les portlets sont placés sur des pages ne nécessitant pas d'authentification.
request.getSession(true) ; sinon, WebSphere Application Server émet des messages d'avertissement comme suit : SESN0066E: Response is already commited to client. Session cookie cannot be set. Dans ce cas, une session temporaire est créée et les informations sur votre session sont perdues à la prochaine demande. Si vous devez activer le suivi de session dans les demandes pour des utilisateurs non authentifiés, définissez le paramètre public.session dans la configuration du service de navigateur du portail ou l'option d'exécution de conteneur com.ibm.portal.public.session dans un descripteur de déploiement d'un portlet JSR 286. Ceci peut entraîner une hausse de la consommation de mémoire. Pour plus de détails sur l'option com.ibm.portal.public.session et un exemple de code, reportez-vous à la rubrique consacrée aux descripteurs de déploiement dans la section relative aux options d'exécution de conteneur. Au lieu d'utiliser ces options, les portlets devant conserver un état d'interaction y compris pour les utilisateurs non authentifiés doivent rendre des paramètres pour garder ces informations au lieu de la session du portlet, comme conseillé par Java Portlet Specification.
Le portlet peut présenter un message approprié à l'utilisateur, s'il a besoin d'une session de portlet valide pour fonctionner correctement. Par exemple:
This content cannot be displayed until you log in.
Please report this problem to the site administrator.
De plus, l'administrateur aura besoin d'informations supplémentaires par rapport à celles fournies par le journal du portlet :
Unable to locate the portlet session.
This portlet requires a session to function.
Move the portlet to an authenticated page or
turn on session tracking for anonymous users.
Si le portlet n'a pas besoin de session pour les opérations critiques, les sous-fonctions imposant la session peuvent éventuellement être supprimées pour les utilisateurs anonymes. Cette possibilité doit donc être évaluée pour chaque portlet.
Si request.getPortletSession() ou request.getPortletSession(true) sont appelés alors que l'utilisateur est déconnecté, et qu'HCL Portal n'est pas configuré pour utiliser une session d'utilisateur anonyme, chaque demande client crée un objet PortletSession extérieur qui est perdu et qui consomme de la mémoire JVM. Ces erreurs augmentent la fréquence des récupérations de place JVM et peuvent réduire la performance de l'ensemble d'HCL Portal.
Pour permettre au portlet de fonctionner sans session, vous devez ajouter cette ligne en début de tous les JSP de portlets.
<%@ page session="false" %>
Sans cette instruction, le compilateur de page JSP génère un code d'accès à la session, même si vous ne l'utilisez pas dans votre JSP. Vous ne pouvez également accéder à aucun bean lorsque la portée est définie comme session de vos pages JSP comme indiqué ci-dessous.
<jsp:useBean ... scope="session" />
Cette action va créer des sessions quand vous ne le souhaitez pas. Vous pouvez par contre déterminer l'existence d'une session, par exemple:
<%
com.ibm.MyClassName theBeanId = null;
PortletSession session = request.getPortletSession(false);
if (session != null) {
theBeanId = (com.ibm.MyClassName)session.getAttribute("theBeanId");
}
// later in your code always check to see if the bean exists before using it
if (theBeanId != null) {
// use the bean
}
%>