VRaptor + Interceptor + Google Ajax Crawlable

5 respostas
rafael.quintino

Olá,
Estava lendo um material da Google a respeito de verificação de páginas web neste site aqui: https://developers.google.com/webmasters/ajax-crawling/docs/getting-started
E descobri que para o google indexar melhor páginas que usam URLs como esta: www.seu_dominio.com.br/path#/deep/link!param=value
Devemos implementar um Filtro que intercepte as requisições e crie um HTML Snapshot para a respectiva URL: www.seu_dominio.com.br/path?escaped_fragment=/deep/link!param=value
Eles sugerem um código utilizando o HtmlUnit: https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot

Agora a pergunta é: Como eu faço isso no VRaptor?
Estou estudando os Interceptor no VRaptor, mas estou confuso a respeito de qual a Interceptor devo sobrescrever, ou antes de qual Interceptor devo colocar o meu.
ResourceLookupInterceptor, ParametersInstantiatorInterceptor ou InstantiateInterceptor? Ou outro?!

Eu vi alguns links que me ajudaram bastante:
http://www.guj.com.br/java/269893-resolvido-vraptor–interceptor-setar-valor-no-request
http://vraptor.caelum.com.br/documentacao/interceptadores/

Mas ainda estou perdido.
Alguem poderia me dar uma luz?
Eu queria configurar isso no VRaptor e não no web.xml pois queria minimizar estas configurações em xml.
Ando tendo alguns problemas quando alguem renomeia classes como esta.
Grato,
Rafael Quintino G. Rosa

5 Respostas

Lucas_Cavalcanti

vc quer transformar o _escaped_fragment em um redirect ou forward, é isso?

coloque o código que vc precisa num interceptor anotado com:

@Intercepts(before=ResourceLookupInterceptor.class, after={})
rafael.quintino

Certo, mas acho que me espressei mal. Esqueci de mencionar que não tenho idéia de como vou fazer o redirecionamento.
Ou melhor, ao sobrescrever o método “public void intercept(…)” como faço para retornar o HTML gerado.
Pensei em colocar este código do gerador de HTML com o HtmlUnit em um Controller com método que chame result.use(Results.http())…
Mas não sei fazer o meu Interceptor chamar este método neste Controller.
Também pensei em fazer o retorno deste HTML direto do Interceptor, só que tamtém não tenho idéia de como fazer isso.

@RequestScoped
@Intercepts(before=ResourceLookupInterceptor.class, after={}) 
public class EscapedFragmentInterceptor implements Interceptor {

    private final HttpServletRequest request;

    public EscapedFragmentInterceptor(HttpServletRequest request) {
        this.request = request;
    }

    public boolean accepts(ResourceMethod method) {
        return true;//Código omitido: Retornando true apenas para requests c/ "_escaped_fragment_"
    }
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
        //Código omitido: Geração do Snapshot HTML com HtmlUnit
        //Como eu retorno este HTML gerado?
    }
}
Lucas_Cavalcanti

faça o seguinte:

String uri = request.getParameter("_escaped_fragment"); // é uma uri, certo?

result.forwardTo(uri);

receba também o Result no construtor.

daí se a uri vier em branco, vc faz o stack.next

rafael.quintino

Uai, não sabia que eu podia usar o forwardTo(…) dentro de um Interceptor!!!
Para mim isto era para ser usado apenas dentro de um Controller.
Vou testar isso assim que tiver um tempinho, ai respondo se consegui.
Valeu!!!

rafael.quintino

Obrigado, o VRaptor se comportou perfeitamente bem com o seguinte código dentro do meu Interceptor:

Agora só estou com um probleminha com o HtmlUnit na hora de gerar o Snapshot. Coloquei um html qualquer e funcionou, mas infelizmente o HtmlUnit está lançando uma exeção aqui.
Mas muito obrigado pela dica. Não tinha idéia que podia usar os recursos de redirecionamento e de results dentro de um Interceptor.

Criado 26 de abril de 2012
Ultima resposta 1 de mai. de 2012
Respostas 5
Participantes 2