Java EE アプリケーションでログインを処理するために、セッション スコープのマネージド Bean を使用しています。ユーザーを認証すると、ユーザー オブジェクトがこのセッション Bean に保存されます。ただし、ページを更新すると、セッション Bean の値が表示されなくなります。
コードをデバッグしていたところ、セッション スコープのマネージド Bean のコンストラクターがページの更新時に再度呼び出され、ユーザー オブジェクトが新しいユーザーで初期化されました。セッションで保持する必要があるため、これは通常の動作ではないと思います。
パラメータやログイン方法など、ログインマネージド Bean の一部を掲載しています。基本的に、enteredEmail とenteredPassword は、ログイン フォームに入力されたデータを表します。認証が成功すると、loggedIn ブール値が true に変わり、ログインしているユーザー オブジェクトが checkedUser 変数に格納されます。
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class LoginController implements Serializable {
@EJB
private LoginSessionBean loginSessionBean;
@EJB
private LecturerFacade lecturerFacade;
private Lecturer checkedUser;
private String enteredEmail;
private String enteredPassword;
private boolean loggedIn;
/** Creates a new instance of loginController */
public LoginController() {
loggedIn = false;
checkedUser = new Lecturer();
}
public String login(){
RequestContext context = RequestContext.getCurrentInstance();
FacesMessage msg = null;
this.setCheckedUser(lecturerFacade.findLecturerByEmail(enteredEmail));
if(loginSessionBean.checkPassword(checkedUser, enteredPassword))
{
loggedIn = true;
msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", checkedUser.getFirstName()+ " " + checkedUser.getLastName());
FacesContext.getCurrentInstance().addMessage(null, msg);
context.addCallbackParam("loggedIn", loggedIn);
}
return "Index";
上記のマネージド Bean が使用する 2 つの EJB も掲載しています。lecturerFacade は、入力された電子メールでユーザー オブジェクトを取得し、loginSessionBean はパスワードをチェックします。
@Stateless
public class LecturerFacade extends AbstractFacade<Lecturer> {
@PersistenceContext(unitName = "EffectinetWebPU")
private EntityManager em;
Logger logger = Logger.getLogger("MyLog");
FileHandler fh;
protected EntityManager getEntityManager() {
return em;
}
public LecturerFacade() {
super(Lecturer.class);
}
public Lecturer findLecturerByEmail(String email) {
try {
return (Lecturer) this.getEntityManager().createQuery("SELECT l FROM Lecturer l WHERE l.email = :email").setParameter("email", email).getSingleResult();
} catch (NoResultException e) {
System.err.println("Caught NOResultException: "+ e.getMessage());
return null;
} catch (NonUniqueResultException e) {
System.err.println("Caught NonUniqueResultException: "+ e.getMessage());
return null;
} catch (IllegalStateException e) {
System.err.println("Caught IllegalStateException: "+ e.getMessage());
return null;
}
}
_
@Stateless
public class LoginSessionBean {
// Add business logic below. (Right-click in editor and choose
// "Insert Code > Add Business Method")
@PersistenceContext(unitName = "EffectinetWebPU")
private EntityManager em;
protected EntityManager getEntityManager() {
return em;
}
public void setEntityManager(EntityManager em) {
this.em = em;
}
public boolean checkPassword(Lecturer user, final String enteredPassword) {
if (user.getPassword().equals(enteredPassword)) {
return true;
} else {
return false;
}
}
}
誰かが何がうまくいかないのかについて何か提案があれば教えてください
アプリケーションサーバーとしてglassfish 3.1を使用し、JSFライブラリとしてPrimefacesを使用しています。また、javax.enterprise からではなく、適切なパッケージから sessionScoped アノテーションをチェックしてインポートしました...