Inicial > CMS > Redirecionamento Para Página Não Encontrada No Liferay

Redirecionamento Para Página Não Encontrada No Liferay

Tenho duas comunidades CA e CB respectivamente em meu portal no Liferay 6.0. Quando uma página requisitada não era encontrada, o usuário era redirecionado para uma página que informava que o recurso não existia (erro 404) e que estava definida na comunidade principal, ou seja, independente da comunidade, um recurso inexistente causava redirecionamento para a página não encontrada da comunidade principal.

Em outras palavras, se o usuário digitasse “www.cb.com.br/xpto” com “/xpto” inexistente na comunidade CB, a URL pedida não seria alterada, mas a página de erro exibida seria a da comunidade CA. Seria como se o usuário tivesse digitado “www.ca.com.br/xpto” com “/xpto” inexistente na comunidade CA.

É possível fazer o redirecionamento de página não encontrada através do portal Liferay respeitando o contexto da comunidade. Como não sabia por onde começar, postei duas perguntas no fórum da Liferay em [L1] e [L2]. Pesquisando um pouco, descobri que foi pedida uma feature para o Liferay 6.2 que se adéqua ao contexto do 6.0 em [L3]. Uma melhoria nos redirecionamentos de página não encontrada foi pedida, mas está no backlog em [L4]. As discussões e “workarounds” que encontrei estão em [L5], [L6], [L7] e [L8].

Primeira Solução

Na verdade, essa era a solução que já estava implementada e que precisava ser alterada. A implementação é relativamente simples, mas não respeita o contexto da comunidade atual. No arquivo portal-ext.properties do Liferay Home, adicione a seguinte propriedade:

layout.friendly.url.page.not.found=/web/guest/page-not-found

Na comunidade principal (via portal), crie uma página chamada “/page-not-found”. Insira nessa página imagens, textos e tudo que achar necessário para comunicar ao usuário que a página requisitada não foi encontrada.

Segunda Solução

Com essa solução, o contexto da comunidade atual é respeitado e a URL requisitada não é perdida. No arquivo portal-ext.properties do Liferay Home, remova a propriedade:

layout.friendly.url.page.not.found=/web/guest/page-not-found

Essa é a propriedade que faz a Primeira Solução funcionar. Adicione as propriedades:

layout.show.http.status=true
layout.friendly.url.page.not.found=/html/errors/404-searchworkings.jsp
com.liferay.portal.servlet.filters.gzip.GZipFilter=false

Crie a página “/page-not-found” em cada comunidade. Insira nessas páginas imagens, textos e tudo que achar necessário para comunicar ao usuário que a página requisitada não foi encontrada. Conforme indicado em [L8], crie um hook que redefina o arquivo /html/errors/404-searchworkings.jsp e faça a seguinte alteração nesse arquivo:

<c:if test="<%= notFoundPageExists %>">
      <c:import url="<%= PortalUtil.getPortalURL(request) + "/page-not-found" %>"/>
</c:if>

Quando um endereço não é encontrado no contexto da comunidade (parte “host” da URL), uma exceção é lançada. Nesse jsp já existe um scriplet que captura a exceção e atualiza a propriedade “notFoundPageExists” para “true”. Sendo a condição verdadeira, faça o “c:import” para alterar manualmente a página exibida, passará a ser a página “/page-nor-found” definida na comunidade. Essa solução funciona perfeitamente em ambiente local, mas quando promovi o hook para outro ambiente, ocorreu uma exceção:

INFO [STDOUT] (ajp-0.0.0.0-8009-3) 10:00:00,000 ERROR [VirtualHostFilter:302] javax.servlet.ServletException: javax.servlet.jsp.JspException: Problem accessing the absolute URL "www.ca.com.br/page-not-found". java.net.ConnectException: Connection timed out
javax.servlet.ServletException: javax.servlet.jsp.JspException: Problem accessing the absolute URL "www.ca.com.br/page-not-found". java.net.ConnectException: Connection timed out
(...)

No ambiente local, “www.ca.com.br” está definido no arquivo “hosts”. O DNS não estava sabendo resolver a URL naquele outro ambiente . O problema é que o “c:import” é resolvido no servidor. Isso implica que para cada nova comunidade criada há necessidade de configuração externa para roteá-la.

Ao invés de fazer isso, troquei “c:import” por “c:redirect” para que a resolução do host fosse feita no cliente. Funcionou, mas com um efeito colateral: a URL acessada é perdida caso não exista. Como exemplo, testei essa a URL:

www.ca.com.br/xpto

Como “xpto” não existe, na barra de navegação o endereço anterior é alterado para:

www.ca.com.br/page-not-found

Terceira Solução

Com essa solução, o contexto da comunidade corrente é respeitado, a URL acessada não é perdida e também não é preciso criar uma página para cada comunidade. Basta criar um hook para customizar o arquivo /html/portal/status.jsp e alterar o trecho abaixo:

<div id="div-teste">
      <img alt="" src="/teste-theme/images/error_404.png" border="1" />
      Este endereço não existe no portal <%= themeDisplay.getLayout().getGroup().getDescriptiveName() %>
</div>

Quando um endereço não é encontrado no contexto da comunidade (parte “host” da URL), uma exceção é lançada. Nesse jsp já existe um scriplet que captura a exceção e atualiza a propriedade “noSuchResourceException” para “true”. Sendo a condição verdadeira, apresento uma imagem e uma mensagem para o usuário. a propriedade “descriptiveName” do “group” apresenta o nome da comunidade atual. A propriedade “name” do “group” só apresenta o nome da comunidade quando se trata da comunidade principal. Quando é uma outra comunidade, “name” retorna “Guest”.

Conclusões

Cada solução tem seus pontos fracos e fortes. Para escolha de uma delas, é necessário fazer uma análise das necessidades.

A Primeira Solução é a ideal quando se tem apenas uma comunidade no portal. É simples para implementar e fácil de alterar.

Embora a Segunda Solução seja mais trabalhosa, é a mais abrangente, pois cada comunidade pode ter sua própria página de erro. Para cada nova comunidade, deve-se configurar o DNS se o “c:import” for utilizado. Se a perda da URL digitada não for importante, pode-se utilizar “c:redirect”.

A Terceira Solução não necessita alteração no portal-ext.properties e nem que sejam criadas páginas específicas. Ela tem dois possíveis pontos fracos: localização de imagens e customização de mensagem de erro por comunidade. As imagens devem ficar dentro de um dos temas, mas como o uso mais comum do Liferay é em uma única instância no container, não é um grande problema. Problema seria se cada comunidade exigisse uma customização específica da página de erro. Não havendo essas restrições, essa é a solução recomendada.

  1. Nenhum comentário ainda.
  1. 04/04/2013 às 7:02 PM

Deixe um comentário