VRaptor 3 - Request está vindo null via interceptor

Olá pessoal, boa tarde. Alguém poderia me ajudar com um problema utilizando o VRaptor?

O problema é o seguinte:

Meu interceptor não está captando parâmetros da request. O “request” está vindo null.

Testei mudar o escopo para Session, configurar web.xml com context-param, entre outras coisas mas nada parece fazer com que meu interceptor capture parâmetros do request.

Abaixo os códigos:

1 - index.jsp Na JSP, minha chamada ao interceptor com um teste simples, passando os parametros a serem capturados:

[code]<%@page contentType=“text/html” pageEncoding=“ISO-8859-1”%>

Dicionário
    </table>

</body>
[/code]

2 - AuthenticationInterceptor, intercepta as requisições para acesso ao sistema:

[code]package br.com.testes.dicionario.web.interceptors;

imports…
/**

  • Interceptor para autenticar o cliente para uso da aplicação.
    */
    @Intercepts
    @RequestScoped
    public class AuthenticationInterceptor implements Interceptor {

    private static final Logger LOG = Logger.getLogger(AuthenticationInterceptor.class);

    private final HttpServletRequest request;
    private final Result result;

    @Override
    public boolean accepts(ResourceMethod method) {
    return true;
    }

    public AuthenticationInterceptor(HttpServletRequest request, Result result) {
    this.request = request;
    this.result = result;
    }

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {

     try {
    
     	String acesso = request.getParameter("dicionarioConnect");
    
     	if (acesso != null && !acesso.equals("") && acesso.equals("conectar")) {
    
     		HttpSession session = request.getSession(true);
     		session.setAttribute("acesso", acesso);
     		
     		result.forwardTo(HomeController.class).index();
    
     	} else {
     		
     		result.forwardTo("/erro.jsp");
     		
     	}
    
     	stack.next(method, resourceInstance);
    
     } catch (Exception e) {
     	
     	LOG.error("Erro capturado, redirecionando para pagina de erro.", e);
     	result.forwardTo("/erro.jsp");
     	
     }
    

    }

}[/code]

3 - web.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

<display-name>Dicionario</display-name>

<context-param>
	<param-name>br.com.caelum.vraptor.encoding</param-name>
	<param-value>UTF-8</param-value>
</context-param>

<context-param>
	<param-name>br.com.caelum.vraptor.packages</param-name>
	<param-value>
		br.com.testes.dicionario.web.interceptors
	</param-value>
</context-param>


<filter>
	<filter-name>sitemesh</filter-name>
	<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>

<filter>
	<filter-name>vraptor</filter-name>
	<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>

<filter-mapping>
	<filter-name>sitemesh</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
	<filter-name>vraptor</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
	<servlet-name>sitemesh-freemarker</servlet-name>
	<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
	<init-param>
		<param-name>TemplatePath</param-name>
		<param-value>/</param-value>
	</init-param>
	<init-param>
		<param-name>default_encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>auto_import</param-name>
		<param-value>macros/html.ftl as html</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>sitemesh-freemarker</servlet-name>
	<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
[/code]

Basicamente, após passar pela verificação de “acesso.equals(“conectar”)”, ele deveria ser diercionado para (HomeController.class).index() mas isso não acontece?

Alguma idéia?

Obrigado a todos!

Se tento o teste System.out.Println(request.getParameter("dicionarioConnect")); vem null.

deixa eu tentar entender o que vc quer fazer com o interceptor:

  • se existe um acesso e ele é “conectar”, vc redireciona para o index
  • senão vc redireciona para “/erro.jsp”

se vc faz isso, vc não deveria chamar o stack.next(). Mas daí nunca iria pra lógica de verdade…

o que vc quer fazer de verdade?

bom… a ideia eh direcionar para a localidade correta. se “dicionarioConnect” vier com valor de “conectar” vai pra index. Se nao vier, vai pra erro. o problema cara, eh que eu printo esse valor ( System.out.println(request.getParameter(“dicionarioConnect”)); ) no interceptor, na linha 31, e esse valor ta vindo null. Nao sei onde estou comendo bola.

Abs.

o problema é que o accepts do interceptor é true, então ele vai interceptar todas as lógicas.

vc tem que mudar o accepts pra aceitar só o método necessário

Hmm…

Não entendi mto essa parte. Ainda não tenho malicia no VRaptor. Como eu mudaria isso? Alguma sugestão?

qual(is) lógica(s) o Interceptor precisa interceptar?

o interceptor precisa apenas captar os parametros que vem na request. nesse caso, o dicionarioConnect, que eu usarei dentro deste interceptor pra processar o resto do codigo. Enfim, só precisa captar os parametros do request.

certo, mas qual controller/metodo ele precisa interceptar? ou ele tem que interceptar todos?

Tem de inteceptar todos mesmo Lucas… :smiley:

então faça algo assim no intercepts, dentro do try…catch:

         HttpSession session = request.getSession(true);  
         if ("conectar".equals(session.getAttribute("acesso"))) {
             stack.next(method, resourceInstance);
         } else {
             String acesso = request.getParameter("dicionarioConnect");  
             if (acesso != null && !acesso.equals("") && acesso.equals("conectar")) {       
                session.setAttribute("acesso", acesso);
                result.forwardTo(HomeController.class).index();  
            } else {  
                result.forwardTo("/erro.jsp");  
            }  
         }

Já fiz o teste, o problema é exatamente que não consego pegar parâmetro da request e nem da Session está vindo tudo nulo…

os parâmetros estão vindo nulos, ou a request e a session estão vindo nulos?

imprime isso:

System.out.println(request.getRequestUri());

o resultado eh do é path da aplicação: /dicionario/

chame essa url:

http://localhost:8080/dicionario/?dicionarioConnect=conectar

assim vai?

Oi Lucas… Deu certo, porém, quando os dados sao submetidos via form (POST) ele não recebe estes parametros. Assim via URL ele recebe os dados da request. Pq via form nao recebe?

tenta colocar na action do form só “/dicionario/”

nao funcionaria, ja que a action está em outro host.

o html que tem o form está em outro host?

se estiver em um html/jsp no mesmo servidor funciona?

Sim. Está em outro host. Não fiz o teste colocando no mesmo host mas de qqr maneira, a necessidade eh que ele passe os parametros via POST, do outro host.