VRaptor 3 - Request está vindo null via interceptor

27 respostas
A

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:

<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>

<html>
    <head>
        <title>Dicionário</title>
    </head>
    <body>
        <table cellpadding="0" cellspacing="0" border="0">
             <tr>
                <td>
                    <form name="formAutentica" method="POST" action="http://localhost:8080/dicionario">
                        <input type="hidden" id="dicionarioConnect" name="dicionarioConnect" value="conectar">
                        <input type="submit" value="Acessar">
                    </form>
                </td>
            </tr>

        </table>

    </body>
</html>

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

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");
			
		}

	}

}

3 - web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">

	<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>

</web-app>

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!

27 Respostas

A

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

Lucas_Cavalcanti

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?

A

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.

Lucas_Cavalcanti

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

A

Hmm…

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

Lucas_Cavalcanti

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

A

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.

Lucas_Cavalcanti

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

A

Tem de inteceptar todos mesmo Lucas… :smiley:

Lucas_Cavalcanti

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");  
            }  
         }
A

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

Lucas_Cavalcanti

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

imprime isso:

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

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

Lucas_Cavalcanti

chame essa url:

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

assim vai?

A

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?

Lucas_Cavalcanti

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

A

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

Lucas_Cavalcanti

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

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

A

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.

Lucas_Cavalcanti

certo, mas faça esse teste por favor, pra ficar mais fácil identificar onde está o erro

A

Localmente funciona. Mas precisa funcionar remoto.

Lucas_Cavalcanti

é algum problema com a chamada, não com a parte do VRaptor…

vc tá fazendo o form direto, sem ajax nem nada?

A

Então Lucas, é sem AJAX mesmo…

Abraços, AS.

Lucas_Cavalcanti

então andredecotia, não faz sentido isso não funcionar só pq o form está em outro sistema

se funcionou com GET (passando a url direto) e com POST dentro da mesma aplicação, deveria também funcionar na outra aplicação…

o que tem nessa outra aplicação?

G

Ajax não funciona em hosts diferentes. Isso é um bloqueio do browser, questões de segurança.

T

Lucas,
aproveitando esse tema… que conselho voce me da? queria salvar as exceções em banco fazendo uma auditoria para verificar depois os possíveis erros…
Qual a melhor prática par isso? usando interceptor? em que ponto seria melhor a implementação? criei um model tipo LogAplicações… queria salvar não só as exceções mas também o ip do usuário…

agradeço sua atençao…

abraço…

G

Não salve exceptions no banco de dados. Até porque pode dar uma exception de “Banco fora do ar”, aí como você vai salvar se o banco está fora?

O mais correto é salvar em arquivo de log normal, inclusive você pode criar um arquivo somente com os erros. E se for o caso um job/scheduler pode importar posteriormente para o banco de dados se necessário.

Criado 1 de março de 2011
Ultima resposta 18 de abr. de 2011
Respostas 27
Participantes 4