2012-04-21 5 views
2

J'essaie de faire un système de sécurité de base sur JSF où, si l'utilisateur n'est pas connecté et essaie d'accéder à une page restreinte, il sera redirigé vers login.xhtml. Ceci est fait dans un filtre de servlet.Comment rediriger sur JSF en utilisant PrimeFaces?

Mon problème est que lorsque vous utilisez resp.sendRedirect ("login.xhtml"); la page de connexion perd toutes les ressources, css, scripts, etc. Donc la page est affichée sans aucun style.

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_3_0.xsd" version="3.0"> 
<context-param> 
<param-name>javax.faces.PROJECT_STAGE</param-name> 
<param-value>Development</param-value> 
</context-param> 
<servlet> 
<servlet-name>Faces Servlet</servlet-name> 
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>Faces Servlet</servlet-name> 
<url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<session-config> 
<session-timeout>30</session-timeout> 
</session-config> 
<welcome-file-list> 
<welcome-file>index.xhtml</welcome-file> 
</welcome-file-list> 
<filter> 
<filter-name>restrict</filter-name> 
<filter-class>br.com.jetcar.filter.RestrictionFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>restrict</filter-name> 
<url-pattern>*.xhtml</url-pattern> 
<servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 
</web-app> 

template.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:p="http://primefaces.prime.com.tr/ui" 
xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <h:outputScript library="primefaces" name="jquery/jquery.js"/> 
    <h:outputStylesheet library="css" name="template.css" /> 
    <h:outputScript name="clock.js" library="js"></h:outputScript> 
    <title><ui:insert name="title">Bem-Vindo</ui:insert></title> 
</h:head> 
<body> 
<p:growl id="messages"/> 
    <div id="header"> 
     <ui:insert name="header"> 
      <div id="headerTitle">JetCar</div> 
      <div id="clock"></div> 
     </ui:insert> 
    </div> 

    <div id="menu"> 
     <ui:insert name="menu"> 
      <ui:include src="menu.xhtml" /> 
     </ui:insert> 
    </div> 

    <div id="content"> 
     <ui:insert name="content"> 
     </ui:insert> 
    </div> 

    <div id="footer"> 
     <ui:insert name="footer"> 
      <p>Desenvolvido por</p> 
      <p>Rodrigo Cavalcante de Souza</p> 
      <p>Jorge Luis</p> 
     </ui:insert> 
    </div> 
</body> 
</html> 

login.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition template="resources/template/template.xhtml" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:p="http://primefaces.org/ui"> 
<ui:define name="title">Login</ui:define> 
<ui:define name="content"> 


</ui:define> 
</ui:composition> 

Le index.xhtml regarde les SAMES comme le login, puisque je suis encore test, quel pourrait être le problème?

erreur de la console chromée

GET http://localhost:8080/JetCar/javax.faces.resource/growl/assets/login.xhtml 404 (Not Found) 
login.xhtml:3GET http://localhost:8080/JetCar/javax.faces.resource/themes/sam/login.xhtml 404 (Not Found) 
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/jquery/login.xhtml 404 (Not Found) 
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/login.xhtml 404 (Not Found) 
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/core/login.xhtml 404 (Not Found) 
login.xhtml:4GET http://localhost:8080/JetCar/javax.faces.resource/login.xhtml 404 (Not Found) 
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/growl/login.xhtml 404 (Not Found) 
login.xhtml:10Uncaught ReferenceError: jQuery is not defined 
chrome-extension://ffdcfjdljhbehggjdkdioajnknjcpbjb/js/sbc_cookies_mon.js:1Uncaught TypeError: Cannot read property 'tagName' of null 

J'utilise primefaces 2.2.1, glassfish 3.1, JSF 2.0

EDIT: Je viens de remarquer que les ressources utilisent l'extension .xhtml aussi, donc il interférait avec le filtre.

CORRECTIF: if(req.getSession().getAttribute("func") == null && !pageRequested.contains("login.xhtml") && !pageRequested.contains("/javax.faces.resource")) resp.sendRedirect("login.xhtml");

Répondre

3

La bonne façon de rediriger les pages sur JSF spécialement dans JSF 2 renvoie le nom de la vue de l'appel de méthode:

Par exemple:

public String doLogin() { 
    //apply the login logic. 
    return "name/of/the/view?facesRedirect=true" 
} 
13

I souvent utiliser de cette façon pour le rediriger directement à partir de Java Bean: FacesContext.getCurrentInstance().getExternalContext().redirect(Url);

1

Votre filtre est rediriger également les requêtes HTTP vers les ressources JSF. Vous devez modifier votre logique de filtre pour ajouter une vérification si la requête en cours n'est pas une demande de ressource JSF. Vous pouvez le faire en vérifiant si l'URI de la demande ne commence pas par ResourceHandler.RESOURCE_IDENTIFIER après le chemin du contexte.

if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { 
    chain.doFilter(request, response); 
} 
else { 
    response.sendRedirect(request.getContextPath() + "/login.xhtml"); 
} 
Questions connexes