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.

L

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.

L

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?

L

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.

L

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

A

Tem de inteceptar todos mesmo Lucas… :smiley:

L

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…

L

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/

L

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?

L

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

A

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

L

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.

L

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.

L

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

L

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