1

Primefaces 3.4.1 をフロントエンドとして JSF 2.0 を使用して映画レンタル アプリケーションを作成しています。ユーザーが正常に登録されたら、新しく作成した ID で自動的にログインし、ホームページにリダイレクトする必要があります。

現在、私はこのようにしています:

@ManagedBean
@ViewScoped
public class RegistrationBean extends BaseBean implements Serializable
{
   ...

   public String register() 
   {
      String nextPage = null;
      User userDetails = new User();

      try 
      {
         BeanUtils.copyProperties(userDetails, this);
         int registrationID = getServiceLocator().getUserService().registerUser(userDetails);
         LOGGER.info("Registered user successfully. Registration ID - {}", registrationID);

         // auto login
         LoginBean loginBean = (LoginBean)FacesUtils.getManagedBean("loginBean");
         loginBean.setUserId(userID);
         loginBean.setPassword(password);
         loginBean.login();
      }
      catch (Exception e) {
         LOGGER.error("Error during registration - " + e.getMessage());
         FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, 
                  FacesUtils.getValueFromResource(RESOURCE_BUNDLE, REGISTRATION_FAIL));
         FacesContext.getCurrentInstance().addMessage(null, message);
      }
      return nextPage;
   }
}

ログイン Bean :

@ManagedBean
@SessionScoped
public class LoginBean extends BaseBean implements Serializable
{
   ...

   public String login() 
   {
      FacesContext ctx = FacesContext.getCurrentInstance();

      try 
      {
         currentUser = getServiceLocator().getUserService().findUser(userID);

         if (currentUser == null) 
         {
            ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, null, 
                     FacesUtils.getValueFromResource(RESOURCE_BUNDLE, UNKNOWN_LOGIN)));
            return (userID = password = null);
         }
         else 
         {
            if (EncryptionUtils.compareHash(password, currentUser.getEncrPass())) {
               return INDEX + "?faces-redirect=true";
            }
            else 
            {
               ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, null, 
                        FacesUtils.getValueFromResource(RESOURCE_BUNDLE, AUTH_FAIL)));
               return null;
            }
         }
      }
      catch (Exception e) 
      {
         final String errorMessage = "Error occured during login - " + e.getMessage();
         LOGGER.error(errorMessage);
         ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, null, errorMessage));
      }

      return null;
   }
}

上記の方法のアプローチregister()は、間違いなく間違っており、安全ではありません。よりクリーンな方法で同じことを達成できる方法はありますか??


f:viewParamを使用した実装

RegistrationBean

int registrationID = getServiceLocator().getUserService().registerUser(userDetails);
LOGGER.info("Registered user successfully. Registration ID - {}", registrationID);
nextPage = LOGIN + "?faces-redirect=true&id=" + registrationID;

login.xhtml

<f:metadata>
   <f:viewParam name="id" value="#{loginBean.regID}" />
   <f:event listener="#{loginBean.autoLogin}" type="preRenderView"></f:event>
</f:metadata>

LoginBean

private int regID;

...

public void autoLogin()
{
   if (regID > 0 && !FacesContext.getCurrentInstance().isPostback())
   {
      currentUser = getServiceLocator().getUserService().findUser(regID);
      NavigationHandler navHandler = FacesUtils.getApplication().getNavigationHandler();
      navHandler.handleNavigation(FacesContext.getCurrentInstance(), null, INDEX + "?faces-redirect=true");
   }
}
4

1 に答える 1

0

3つのページがあると仮定しましょう

  1. 登録/ユーザーサインアップ
  2. ログイン
  3. ホームページ

ここで登録に成功するには自動ログインが必要で、ホームページにリダイレクトする必要がありますが、通常は登録後に手動ログインが必要です。

とにかく、ファサードクラスの別のメソッドでログイン資格情報チェックを分離することをお勧めします。または、LoginBean でも行うことができます。

public User doLogin(String userName, String password) {
     // query user
     // match with password
     // return null if not found or not matched
}

登録 Bean とログイン Beannavigation-ruleのアドインfaces-config.xml

 <navigation-case>
        <from-outcome>loginSuccess</from-outcome>
        <to-view-id>/home.xhtml</to-view-id>
        <redirect/>
 </navigation-case>

登録 Bean とログイン Bean の呼び出しdoLoginメソッドの両方で、ユーザーがナビゲーションの設定を見つけた場合

NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
nh.handleNavigation(facesContext, null, "loginSuccess");
于 2013-01-01T07:42:18.657 に答える