2010-09-20 68 views
7

Estoy teniendo problemas al tratar de establecer una cookie de sesión en Liferay 6.0 portlets. Deseo poder establecer una cookie en el navegador del cliente para almacenar la clave de la aplicación para la autenticación de LinkedIn, donde otros portlets pueden recuperarla.¿Cómo configurar una cookie en el portlet Liferay?

Soy capaz de leer las cookies mediante el uso de un siguiente:

public void addLinkedInCV(ActionRequest request, ActionResponse response) 
     throws PortalException, SystemException { 

    HttpServletRequest convertReq = PortalUtil.getHttpServletRequest(request); 
    Cookie[] cookies = convertReq.getCookies(); 
    ... 
} 

Aquí está mi intento fallido de leer uno.

@Override 
public void doView(RenderRequest renderRequest,RenderResponse renderResponse) throws IOException, PortletException { 

    HttpServletResponse convertRes = PortalUtil.getHttpServletResponse(renderResponse); 
    HttpServletResponse originalRes = (HttpServletResponse) ((HttpServletResponseWrapper) convertRes).getResponse(); 

    Cookie linkedInCookie = new Cookie("linkedIn", util.getAppKey()); 
    originalRes.addCookie(linkedInCookie); 
} 

Respuesta

4

Sin fuertemente modificar el portal de Liferay en sí, me pareció que la única manera de establecer las galletas de portlets es tener el portlet generar un javascript, que luego dejar que el cliente establece la cookie.

Así que agregué lo siguiente al método doView.

if (renderRequest.getPortletSession(true).getAttribute("set_cookie")!=null){ 
    return; 
} 

String cookie_value = renderRequest.getPortletSession(true).getId(); 
String cookie_hours = "6"; 

StringBuffer buf = new StringBuffer(); 
buf.append("\n <script>"); 
buf.append("\n var today = new Date();"); 
buf.append("\n var expires_date = new Date (today.getTime() + (" + cookie_hours + "*1000*60*60));"); 
buf.append("\n document.cookie = \"linkedIn=" + util.getAppKey() + ";expires=\"+expires_date.toGMTString();");  
buf.append("\n </script>"); 

renderResponse.setContentType("text/html"); 
PrintWriter out = renderResponse.getWriter(); 
out.println(buf.toString()); 
renderRequest.getPortletSession(true).setAttribute(SET_COOKIE, cookie_value); 
No

un óptimo, pero un nethertheless solución de trabajo;)

Cuestiones relacionadas