2014-11-27 3 views
1

ПРИМЕЧАНИЕ: пользователь в этих сценариях уже имеет учетную запись. Я использую Java EE 7: JSF 2.2, GLassfish 4.1 и аутентификацию на основе. Цель: когда вход в систему (вход в систему) в первый раз я хочу перенаправить на страницу (например): a.xhtml, чтобы он ввел некоторую информацию. после этого каждый раз, когда он войдет в систему, будет redierct на страницу: normal.xhtml и NOT a.xhtml. как вы можете видеть в следующем коде после входа пользователя в систему, он всегда будет перенаправлен на a.xhtml и что это проблема:JSF 2.2 & Аутентификация: состояние перенаправления

<security-constraint> 
    <display-name>securityConstraint1</display-name> 
    <web-resource-collection> 
     <web-resource-name>resources</web-resource-name> 
     <description></description> 
     <url-pattern>/private/* </url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>Admin</role-name> 
    </auth-constraint> 

    </security-constraint> 
     <login-config> 
     <auth-method>FORM</auth-method> 
     <realm-name>ProjRealm</realm-name> 
     <form-login-config> 
      <form-login-page>/login.xhtml</form-login-page> 
      <form-error-page>/public/pages/forbidden.xhtml</form-error-page> 
     </form-login-config> 
     </login-config> 
     <security-role> 
     <role-name>Admin</role-name> 
     </security-role> 
     <welcome-file-list> 
     <welcome-file>private/inscription/a.xhtml</welcome-file> 
     </welcome-file-list> 

второй вопрос: , когда я посетил «страницу проекта по умолчанию» : http://localhost:8080/Pro1.0/ сервер хочет перенаправить меня на защищенный файл a.xhtml, и поскольку пользователь не аутентифицирован, сервер перенаправляет меня на страницу «form-login-page», объявленную в web.xml, мой вопрос здесь в том, что я могу сделать сервер перенаправляет страницу проекта по умолчанию на общедоступную страницу (домашнюю страницу, такую ​​как любой веб-сайт), и перенаправляет пользователя при аутентификации на приватную страницу, такую ​​как normal.xhtml, как задано в первом вопросе. Спасибо, и если у вас есть вопрос, я здесь.

UPDATE: Спасибо Оскарс Pakers для решения

Вот моя реализация: web.xml:

<welcome-file-list> 
    <welcome-file>redirect.xhtml</welcome-file> 
    </welcome-file-list> 

redirect.xhtml:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html"> 
<f:metadata> 
    <f:viewAction action="#{redirect.testUser}"></f:viewAction> 
</f:metadata> 
<h:head> 
</h:head> 
<h:body> 
    <h1>TEST Redirect</h1> 
</h:body> 
</html> 

Redirect.java :

@Named 
@RequestScoped 
public class Redirect extends BaseBacking { 

private static final String AAA = "/private/inscription/aaa.xhtml?faces-redirect=true"; 
private static final String NORMAL = "/private/sections/normal.xhtml?faces-redirect=true"; 
private static final String HOME = "/home.xhtml?faces-redirect=true"; 

@EJB 
private EJBClass EJBClass; 

public String testUser() { 
    Principal user = getRequest().getUserPrincipal(); 
    if (user == null) { 
     return HOME; 
    } 
    BigInteger Id = /*here I call a EJBClass method so I can decide is it the first time the user login OR NOT*/(user.getName()); 
    if (Id == null) { 
     return AAA; 
    } else { 
     return NORMAL; 
    } 
} 
} 

ответ

0

первый вопрос
Я вижу два варианта здесь.

  1. Вы можете проверить на странице a.xhtml, что пользователь был там (и введенной информации) и перенаправить его на normal.xhtml
  2. Вы можете переключиться на программный логин, сделать пользовательскую страницу JSF и выполнять поддержку метод компонента похож на этот

    струнного входа() { HttpServletRequest запрос = (HttpServletRequest) FacesContext.getCurrentInstance() getExternalContext() GetRequest()..; request.login (имя пользователя, пароль); // проверить, был ли пользователь в a.xhtml return "a.xhtml"; // или возвращение «normal.xhtml» }

второй вопрос

Подобный вопрос, следует сначала проверить на вашей общедоступной странице, если пользователь вошел в систему и перенаправлять на своей странице. Как вы используете JSF 2.2. вы видели

<f:viewAction 

бирка? Он выводит метод при входе на страницу. Вы можете вернуть результат, если хотите перенаправить пользователя.
См. f:viewAction