Filter setAttribute sendRedirect JSF

10 respostas
jsf
J

Estou usando o seguinte código o qual preciso enviar um atributo no doFilter e capturar na tela redirecionada. Como capturar o código na tela?

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    if (request.getRequestURI().contains("/emitente/")) {
        chain.doFilter(request, response);
    } else {

        if (contextBean.getEmitenteSelecionado() == null) {
            response.sendRedirect(request.getContextPath() + "/pagina1.xhtml");

        } else if (contextBean.getCaminhoCertificado() == null) {
            request.setAttribute("codErro", 1);
            response.sendRedirect(request.getContextPath() + "/pagina2.xhtml");

        } else if (contextBean.getSenhaCertificado() == null) {
            request.setAttribute("codErro", 2);
            response.sendRedirect(request.getContextPath() + "/pagina3.xhtml");

        } else {
            chain.doFilter(request, response);
        }
    }

}

10 Respostas

R

Simulei em um projeto de teste aqui e consegui assim:

#{requestScope.codErro}
J

Efetuei o teste e não pegou o valor.
<h:outputText value="#{param['codErro']}" /> <h:outputText value="#{requestScope.codErro}" />

R

@jeroqueiroz eu fugi um passo, não dei o sendRedirect. E quando coloco aqui ele fica em loop até dar exception(Se uso a confirmação de prosseguir chain.doFilter(request, response) junto.). Eu já fiz algo similar que era com usuario logado. Segue meu filter caso te ajuda:

@WebFilter
public class LoginFilter implements Filter, Serializable {
	private static final long serialVersionUID = 1L;
	
	FilterConfig fconfig;
	
	@Inject
	private UsuarioLogged usuarioLogged;
	
    public void destroy() {
 
    }
 
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
    	HttpServletRequest req = (HttpServletRequest) request;  
    	HttpServletResponse res = (HttpServletResponse) response;
    	
    	if (usuarioLogged.getUsuario() == null || !usuarioLogged.isLogado()) {
    		fconfig.getServletContext().getRequestDispatcher("/pages/index.jsp").
    		 	forward(request, response);
    	} else {
	       chain.doFilter(request, response);
    	}
    	System.out.println("requisi磯 .......");
	}
 
    public void init(FilterConfig filterConfig) throws ServletException {
    	fconfig = filterConfig;
    }
 
}
J

Alterei para:

request.setAttribute("codErro", "1"); RequestDispatcher rd = request.getRequestDispatcher("/pagina1.xhtml"); rd.forward(request, response);

Consegui pegar na tela com:
<p:outputLabel value="#{requestScope.codErro}" />

Porém preciso pegar no Bean desta tela antes de ser exibido, algo do tipo:
<f:metadata> <f:setPropertyActionListener target="#{gerenciaNfeBean.codErro}" value="1" /> <f:event listener="#{gerenciaBean.carregarValidacao}" type="preRenderView" /> </f:metadata>

Tem alguma sugestão de como pegar no bean ?

R

Nem testei, tenta algo do genero:

@PostConstruct
public void init(){
    FacesContext.getExternalContext().getRequestParameterMap();
    String codError= params.get("codError");
}

Achei um post que diz que, com o

@ManagedProperty("#{param.id}")

também funciona.

J
Coloquei o metodo init e ele não entrou no método.

@PostConstruct

public void init() {

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map<String, String> params = externalContext.getRequestParameterMap();
String codErro = params.get("codError");

if (codErro == "1") {
	FacesUtil.addErrorMessage("Erro 1.");

} else if (codErro == "2") {
	FacesUtil.addErrorMessage("Erro 2.");
}

}

Então adicionei:

< f:metadata>

< f:event listener="#{gerenciaNfeBean.init()}" type=preRenderView />

< /f:metadata>

Agora ele passa no metodo, mas não captura o valor do atributo.

R

O que chama estas telas? Pq este :

< f:metadata>
< f:event listener="#{gerenciaNfeBean.init()}" type="preRenderView" />
< /f:metadata>

rsrs eu tenho que implementar a NFe tbm tou usando as lib’s da javac excelentes.

J

Isto eu coloquei porque o @PosConstruct não executou o método init.

R

@jeroqueiroz eu tava relendo seu problema e lembrei que já vi algo assim, onde o usuário tentava iniciar um processo mas faltava alguma informação selecionado no sistema. Lembro que foi feito com @Observe do CDI, irei tentar montar algo e te passo.

J

Alterei a forma que estava fazendo para:

response.sendRedirect(request.getContextPath() + "/cadastro.xhtml?codErro=1");

Na View coloquei:
<f:metadata> <o:viewParam name="codErro" value="#{emitenteBean.codErro}" /> <f:event listener="#{emitenteBean.carregarEmitente()}" type="preRenderView" /> </f:metadata>

Porém por algum motivo ele não esta executando o preRenderView.

Criado 17 de novembro de 2016
Ultima resposta 18 de nov. de 2016
Respostas 10
Participantes 2