2017-06-19 3 views
0

Ich versuche, das Sitzungsattribut [HTTP oder Portlet-Sitzung] so einzustellen, dass ich global (über das Portal) darauf zugreifen kann. Aber während ich das Attribut "Session" erhalte, wird mir der Wert "null" anstelle des tatsächlichen Werts zurückgegeben.Liferay 7 kann das globale Sitzungsattribut nicht festlegen

Einstellen der Session Attribut:

@Component(
immediate = true, 
property = { 
    "com.liferay.portlet.display-category=IPC Sender", 
    "com.liferay.portlet.instanceable=true", 
    "javax.portlet.display-name=IPC_Sender Portlet", 
    "javax.portlet.init-param.template-path=/", 
    "javax.portlet.init-param.view-template=/view.jsp", 
    "com.liferay.portlet.private-session-attributes=false", 
    "javax.portlet.resource-bundle=content.Language", 
    "javax.portlet.security-role-ref=power-user,user" 
}, 
service = Portlet.class 
) 

public class ipcsenderPortlet extends MVCPortlet { 

public void hello(ActionRequest actionRequest, 
     ActionResponse actionResponse) throws Exception 
{ 
//Trying to set HttpSession but its also getting null while retrieving 
HttpServletRequest httpreq = PortalUtil.getHttpServletRequest(actionRequest); 
HttpSession session = httpreq.getSession(true); 
session.setAttribute("transfer", "content"); 

////Trying to set Portletsession but its also getting null while retrieving 
PortletSession portletsession = actionRequest.getPortletSession(); 
portletsession.setAttribute("sendvalue","abcde", 
PortletSession.APPLICATION_SCOPE); 
} 
} 

die Session Attribut in verschiedenen Portlet LERNEN:

@Component(
    immediate = true, 
    property = { 
     "com.liferay.portlet.display-category=IPC Receiver", 
     "com.liferay.portlet.instanceable=true", 
     "javax.portlet.display-name=IPC_Receiver Portlet", 
     "javax.portlet.init-param.template-path=/", 
     "javax.portlet.init-param.view-template=/view.jsp", 
     "javax.portlet.resource-bundle=content.Language", 
     "com.liferay.portlet.private-session-attributes=false", 
     "javax.portlet.security-role-ref=power-user,user" 
    }, 
    service = Portlet.class 
) 
public class ipcreceiverPortlet extends MVCPortlet 
{ 
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException 
    { 
     //HttpSession 
     HttpServletRequest httpreq = PortalUtil.getHttpServletRequest(renderRequest); 
     HttpSession session = httpreq.getSession(); 
     String name = (String)session.getAttribute("transfer"); 
     System.out.println("Session value through HttpSession:"+name); 

     //PortletSession 
     PortletSession portletsession = renderRequest.getPortletSession(); 
     String userName = (String) portletsession.getAttribute("sendvalue",PortletSession.APPLICATION_SCOPE); 
     System.out.println("\nSession value through PortletSession:"+userName); 
    } 
} 

Antwort

0

Wir hatten das gleiche Problem, das wir LR7.0 verwenden. Ich bin mir nicht sicher, ob das ein Bug oder sowas ist. Aber als Workaround haben wir das gemacht. Wir bekommen die ursprüngliche Sitzung.

HttpServletRequest httpRequest = PortalUtil.getOriginalServletRequest (PortalUtil.getHttpServletRequest (renderRequest)); HttpSession Sitzung = httpRequest.getSession(); session.setAttribute ("testAttr", "hi");

Hoffe, dass hilft!

1

Dies ist kein Fehler! Liferay ist ein Portlet-Container und in der Portlet-Spezifikation ist jedes Portlet ein anderer Kontext mit einer anderen Sitzung. Sie versuchen, Daten in einer Portlet-Sitzung zu speichern und in einer anderen Portlet-Sitzung wiederherzustellen. Dies ist nicht korrekt. Liferay stellt ein Verfahren, das Portal globale Sitzung zu erhalten:

 PortalSessionThreadLocal.getHttpSession(); 

Diese Sitzung kann von jedem Portlets des Portals abgerufen werden, aber es ist wichtig, festzulegen, dass Daten in der globalen Sitzung speichern ist in Cluster-Umgebungen vor allem dringend abgeraten, denn wenn Wenn Sie eine Instanz aus einer Klasse speichern, die nur in einem Portlet vorhanden ist, können Sie ClassNotFoundException von einem anderen Portlet abrufen, das diese Klasse nicht kennt. Eine globale Sitzung wird nur für das Speichern primitiver Daten empfohlen.

Verwandte Themen