2013-01-01 34 views
1

我正在使用JSF 2.0和Primefaces 3.4.1作为前端创建电影租赁应用程序。用户成功注册后,我需要使用新创建的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; 
    } 
} 

LoginBean:在register()方法

@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; 
    } 
} 

上面的方法是,毫无疑问,错误和没有安全感。有什么办法可以以更清洁的方式达到同样的效果吗?


使用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"); 
    } 
} 

回答

0

因此,让我们假设你有

  1. 注册/用户注册
  2. 登录
  3. 首页

这里注册成功需要汽车三页登录并需要重定向到主页e但通常是手动登录是必须在注册后。

无论如何,我建议你在一个门面类中单独的登录凭证检查,或者你也可以在LoginBean中使用它。

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

faces-config.xml添加navigation-rule登记豆和登录豆

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

在这两种注册豆和登录豆呼叫doLogin方法然后如果用户发现设置导航

NavigationHandler nh = facesContext.getApplication().getNavigationHandler(); 
nh.handleNavigation(facesContext, null, "loginSuccess"); 
+0

感谢您的答复。但是有没有办法,我可以将调用转发给LoginBean中的'login()'方法,因为'doLogin()'做同样的事情。 – Vrushank

+0

是的,你可以做到这一点。使用param将注册页面转发到登录页面,然后在请求中发现的登录bean参数中进行处理。 – vels4j

+0

我能够用preRenderView事件侦听器使用来实现您的建议。我正在更新我的帖子以反映相同。感谢您的建议。请让我知道你是否可以对我的实施提出任何改进建议。 – Vrushank