2013-11-18 3 views
0

Я нашел решение в stackoverflow, как закодировать логин в JSF, используя HttpServletRequest. Первые вещи во-первых, login.xhtml:JSF Войти с HttpServletRequest

<?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"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html"> 

<h:head> 
    <title>Login</title> 
</h:head> 
<h:body> 
    <h3>Login here</h3> 
    <h:form id="loginForm"> 
     <h:outputLabel for="username" value="Username:" /> 
     <h:inputText value="#{loginService.userName}" id="username" requried="true" /> 
     <br/> 
     <h:outputLabel for="password" value="Password:" /> 
     <h:inputSecret value="#{loginService.password}" id="password" requried="true" /> 
     <br/> 
     <h:commandButton id="button" value="Login" action="#{loginService.doLogin}" /> 
     <br/> 
     <h:commandLink action="#{navigationService.redirectToIndex}" value="Home" /> 
     <br/> 
     <h:messages /> 
     <br/> 
    </h:form> 
</h:body> 

loginService:

@Named 
@SessionScoped 
public class LoginService implements Serializable { 

private String userName = ""; 
private String password = ""; 
@Inject 
private NavigationService navigationService = null; 
@Inject 
private String originalURL = ""; 

/** 
* 
*/ 
@PostConstruct 
public void init() { 
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 

    this.originalURL = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 

    if(this.originalURL == null) { 
     this.originalURL = externalContext.getRequestContextPath() + navigationService.toIndex(); 
    } else { 
     String originalQuery = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_QUERY_STRING); 

     if(originalQuery != null) { 
      this.originalURL += "?" + originalQuery; 
     } 
    } 
} 

/** 
* 
* @return 
* @throws IOException 
*/ 
public void doLogin() throws IOException { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 
    HttpServletRequest request = (HttpServletRequest)externalContext.getRequest(); 

    try { 
     request.login(this.userName, this.password); 

     User user = dao.findUserByUserName(userName); 

     externalContext.getSessionMap().put("user", user); 
     externalContext.redirect(this.originalURL); 
    } catch(ServletException e) { 
     context.addMessage(null, new FacesMessage("Unknown login")); 
    } catch (NoSuchUserException e) { 
     context.addMessage(null, new FacesMessage(e.getMessage())); 
    } 
} 

/** 
* 
* @return 
* @throws IOException 
*/ 
public void doLogout() throws IOException { 
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 

    externalContext.invalidateSession(); 
    externalContext.redirect(externalContext.getRequestContextPath() + navigationService.toLogin()); 
} 

// Getters and Setters 
} 

Единственное, что я все еще нужно знать теперь:

Где можно определить для каких страниц требуется логин?

ответ

2

Предлагаемое решение: размещение всех страниц, требующих ведения журнала под одним местом (папка, например: «private_section»), а страницы, которые не нужны (публичный доступ), должны быть размещены везде, где в контексте проекта за исключением папки «private_section». Затем вы можете использовать простой фильтр для контроля доступа к частной области (в нашей папке), и через этот шаблон (первый аннотаций) вы можете указать область управлять:

// imports  

@WebFilter("/private_section/*") 
public class LoggingFilter implements Filter { 


@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest)request; 
    HttpServletResponse res = (HttpServletResponse)response; 
    UserBean user = (UserBean) req.getSession().getAttribute("user");   
    if (user != null && user.isLoggedIn()){ 
      chain.doFilter(request,response); 
    } 
    else res.sendRedirect(req.getContextPath()+"/index.xhtml"); 
} 

// other overriden methods 
+0

я не нужны записи в Интернете. XML? причина аннотации @WebFilter? – user1882812

+0

Нет, этого достаточно. В версиях JSF 2.X аннотация становится альтернативой существующей записи. – Omar

+0

Erm, фильтры не являются частью JSF. Поэтому это абсолютно не связано с тем, используете ли вы JSF 2.x или нет, чтобы использовать '@ WebFilter'. – BalusC

Смежные вопросы