Olá, você conseguiu resolver esse problema? Estou com um parecido aqui… Caso tenha conseguido pode me passar a solução?
Obrigado.
Quem inicia o Context é o próprio JSF quando um ManagedBean é acessado…
Se ele estiver nulo é pq não há contexto e com isso não razão para obter o mesmo.
Você não pode armazenar o que precisa na sessão Http? Assim a informação ficaria disponível no filtro, antes do Faces começar o trabalho dele.
Vou postar meu código que faço isso junto com as partes desnecessarias pois estou sem tempo.
Depois voces usam a parte que precisam.
package br.com.web.tecea.filter;
import java.io.IOException;
import javax.faces.FactoryFinder;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.web.tecea.handler.UsuarioHandler;
import br.com.web.tecea.model.usuario.NivelAcesso;
import br.com.web.tecea.util.FacesUtil;
public class PerfilFilter implements Filter {
public static String context;
private FilterConfig config;
private ServletContext servletContext;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) req;
String url = hreq.getRequestURL().toString();
UsuarioHandler userHandler = (UsuarioHandler) FacesUtil.getValue(
getFacesContext(req, res), null, "usuarioHandler");
NivelAcesso nivel = userHandler.getNivelAcesso();
if (userHandler.isLoged())
for (String perm : nivel.getObservacao().split(";"))
if (url.contains(perm)) {
arg2.doFilter(req, res);
return;
}
String context = config.getServletContext().getContextPath();
redirect((HttpServletResponse) res, context + "/s-index.jsf");
}
private void redirect(HttpServletResponse res, String page)
throws IOException {
res.sendRedirect(page);
}
public void init(FilterConfig arg0) throws ServletException {
config = arg0;
servletContext = arg0.getServletContext();
context = config.getServletContext().getContextPath();
}
private abstract static class InnerFacesContext extends FacesContext {
protected static void setFacesContextAsCurrentInstance(
FacesContext facesContext) {
FacesContext.setCurrentInstance(facesContext);
}
}
private FacesContext getFacesContext(ServletRequest request,
ServletResponse response) {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext != null)
return facesContext;
FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder
.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory
.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(servletContext, request,
response, lifecycle);
InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
UIViewRoot view = facesContext.getApplication().getViewHandler()
.createView(facesContext, "/Tecea/");
facesContext.setViewRoot(view);
return facesContext;
}
}
Olá Pessoal,
A pouco tempo entrei em um projeto que usa JSF com xhtml no servidor OC4J. Não sabia JSF e aprendi no uso.
O projeto tem alguns necessidades, uma delas é o teste de acesso via AD (Active Directory) do Windows e se não tiver no AD ele abre a tela de login.
Ao acessar um página diretamente pela URL ela carrega normalmente e inicia o contexto (FacesContext.getCurrentInstance() != null). Quando faço um acesso via java, para obter o contexto, ele ainda não foi iniciado e é null. No web.xml tenho um filtro que chama o código para o acesso ao AD que encaminha para a tela de login ou para a tela princilpal. Com o uso do AD preciso acessar algo no código java iniciado pelo contexto sem chamar páginas.
Como posso iniciar o contexto do JSF para que o objeto FacesContext.getCurrentInstance() seja diferente de null sem chamar páginas (URL).
Agradeço desde já.