Session JSF在请求范围Bean中注入和访问会话范围的ManagedBean
我有一个@SessionScoped ManagedBean,我已经将它注入到@RequestScope中,以访问存储在会话中的用户。我的代码正在运行,我只是想知道我是否使用了良好的实践,如果没有,你能告诉我出了什么问题吗?因为我是JSF新手,我不想从一开始就学习一些糟糕的编码,所以提前非常感谢 我的实体提款人:Session JSF在请求范围Bean中注入和访问会话范围的ManagedBean,session,jsf,jakarta-ee,code-injection,requestscope,Session,Jsf,Jakarta Ee,Code Injection,Requestscope,我有一个@SessionScoped ManagedBean,我已经将它注入到@RequestScope中,以访问存储在会话中的用户。我的代码正在运行,我只是想知道我是否使用了良好的实践,如果没有,你能告诉我出了什么问题吗?因为我是JSF新手,我不想从一开始就学习一些糟糕的编码,所以提前非常感谢 我的实体提款人: @Entity public class Utilisateur { @Id @GeneratedValue( strategy = Generati
@Entity
public class Utilisateur {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
@NotNull( message = "Veuillez saisir une adresse email" )
@Pattern( regexp = "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)", message = "Merci de saisir une adresse mail valide" )
private String email;
@Column( name = "mot_de_passe" )
@NotNull( message = "Veuillez saisir un mot de passe" )
@Pattern(regexp = ".*(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*", message = "Le mot de passe saisi n'est pas assez sécurisé")
private String motDePasse;
@NotNull( message = "Veuillez saisir un nom d'utilisateur" )
@Size( min = 3, message = "Le nom d'utilisateur doit contenir au moins 3 caractères" )
private String nom;
@Column( name = "date_inscription" )
private Timestamp dateInscription;
//getters .. setters..
}
我的朋友告诉我:
@Entity
public class Ferme {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column( name = "id_ferme" )
private Long id_ferme;
@Column( name = "nom_ferme" )
private String nom_ferme;
@ManyToOne
@JoinColumn( name = "utilisateur_id" )
private Utilisateur utilisateur;
//getters .. setters..
}
我的无柄刀:
@Stateless
public class UtilisateurDao {
@PersistenceContext( unitName = "myBD_PU" )
private EntityManager em;
public List<Ferme> lister( Utilisateur user) throws DAOException {
try {
TypedQuery<Ferme> query = em.createQuery( "SELECT u FROM Ferme u WHERE u.utilisateur = :userid", Ferme.class );
query.setParameter("userid", user);
return query.getResultList();
} catch ( Exception e ) {
throw new DAOException( e );
}
}
}
我的李斯特豆:
@ManagedBean
@RequestScoped
public class ListeFermesBean implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@ManagedProperty(value="#{loginBean}")
private LoginBean loginBean;
@EJB
UtilisateurDao utilisateurDao;
private Utilisateur user;
private List<Ferme> liste;
public List<Ferme> getListe() {
liste = new ArrayList<Ferme>();
user = loginBean.getUser();
return liste = utilisateurDao.lister(user);
}
}
正如评论中所说,您应该使用cdi注入。我相信这也是一个很大的禁忌:
public List<Ferme> getListe() {
liste = new ArrayList<Ferme>();
user = loginBean.getUser();
return liste = utilisateurDao.lister(user);
}
public List getListe(){
liste=newarraylist();
user=loginBean.getUser();
return liste=usilisaturdao.lister(用户);
}
你应该不要在你的能手/接班人中做任何业务密集型的事情。原因是这些可以在后台多次调用
相反,您应该在注入服务后调用的方法中调用服务
@PostConstruct
public void init(){
listeFerm = utilisateurDao.lister(user);
}
public List<Ferm> getListFerm(){
return listFerm;
}
@PostConstruct
公共void init(){
ListFerm=使用Urdao.lister(用户);
}
公共列表getListFerm(){
返回李斯特弗姆;
}
您没有发布auth方法(可能是故意的)
调整你的认证系统,你说你会处理后,但你仍然不需要通过这道。您应该阅读文档中关于JAAS的内容,这是如何自动处理这个问题的,然后您不需要通过服务,您可以在bean中对用户进行身份验证。ie:Request.login(用户名、密码)
如果我没记错的话。不过,您必须阅读有关主题的内容,在对用户进行身份验证时应该使用hash+salt
@Named
@SessionScoped
public class LoginBean implements Serializable {
private static final long serialVersionUID = 1L;
private String email,mdp;
private Utilisateur user;
private boolean LoggedIn;
private List<Ferme> liste;
private Ferme ferme = new Ferme();
@Inject
UtilisateurDao utilisateurDao;
public Ferme getFerme() {
return ferme;
}
public void setFerme(Ferme ferme) {
this.ferme = ferme;
}
public void setListe(List<Ferme> liste) {
this.liste = liste;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMdp() {
return mdp;
}
public void setMdp(String mdp) {
this.mdp = mdp;
}
public Utilisateur getUser() {
return user;
}
public void setUser(Utilisateur user) {
this.user = user;
}
public boolean isLoggedIn() {
return LoggedIn;
}
public void setLoggedIn(boolean loggedIn) {
LoggedIn = loggedIn;
}
public String authentification() {
if (utilisateurDao.login(email, mdp) != null) {
user = utilisateurDao.login(email, mdp);
LoggedIn = true;
return "listeFermes.xhtml?faces-redirect=true";
}
LoggedIn = false;
FacesMessage message = new FacesMessage( "Wrong E-mail or Password!" );
FacesContext.getCurrentInstance().addMessage( null, message );
return "";
}
public String logout() {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("You are disconnected!"));
ExternalContext externalContext = context.getExternalContext();
externalContext.getFlash().setKeepMessages(true);
externalContext.invalidateSession();
return "/login.xhtml?faces-redirect=true";
}
public void deleteFerme(int id) {
utilisateurDao.supprimerFerme(user, id);
}
public void addFerme() {
utilisateurDao.creerFerme(ferme, user);
}
public List<Ferme> getListe() {
return liste;
}
@PostConstruct
public void init(){
liste = utilisateurDao.lister(user);
}
//登录方法
@Stateless
public class UtilisateurDao {
@PersistenceContext( unitName = "MyBD_PU" )
private EntityManager em;
public Utilisateur login(String email, String mdp) throws DAOException {
Utilisateur user = null;
Query requete = em.createQuery( JPQL_LOGIN );
requete.setParameter( PARAM_EMAIL, email ).setParameter(PARAM_PWD, mdp);
try {
user = (Utilisateur) requete.getSingleResult();
if (user!=null) {
return user;
}
return null;
} catch ( NoResultException e ) {
return null;
} catch ( Exception e ) {
FacesMessage message = new FacesMessage( FacesMessage.SEVERITY_ERROR, e.getMessage(), null );
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage( null, message );
}
return user;
}
}
我会使用CDI而不是JSF(
@Named
而不是@ManagedBean
,@Inject
而不是@ManagedProperty
和scopes-这是一种较新的技术),我不会将@EJB
注入@RequestScoped
中,但我会在@SessionScoped
中创建这个方法并委托调用它。使用@Stateless
这不是问题,但如果您使用@Stateful
@Geinmachi,则会出现问题。谢谢您的建议。如果我理解了,你是说我不应该在SessionScoped和RequestScoped中都注入EJB,而是应该创建所有使用会话中的“User”对象的方法到SessionScoped中,然后我可以在RequestScoped Bean中调用它们?是的,下面是关于将@Stateful
注入@RequestScoped
的线程,这样您就可以了解我在说什么了@好的,非常感谢你的帮助!TL;DR:将范围更广的JSF托管bean注入范围更窄的JSF托管bean是一个合法的游戏。然而,事实恰恰相反。换句话说,将会话范围的JSF托管bean注入请求范围的JSF托管bean是完全合法的。感谢您的回答,我的登录域现在是这样的(在上面的新答案中),我不能将它添加到这个评论中。我再次发布了我的身份验证方法(在上面的新答案中)如果这就是你说的。提前感谢:)@dwix您是否计划将密码存储为纯文本?因为这就是你丢失每个用户密码的原因。当你发布附加代码时,你应该编辑你的主要问题。我要把我在reguards上的帖子编辑成你的新代码。然后你可以接受我的答案,因为它帮助了你(点击v)。另外,欢迎对互联网积分进行投票。不,我稍后会处理密码,谢谢!我会投票让你知道这是否有帮助:)同意,谢谢你的好意!
@PostConstruct
public void init(){
listeFerm = utilisateurDao.lister(user);
}
public List<Ferm> getListFerm(){
return listFerm;
}
@Named
@SessionScoped
public class LoginBean implements Serializable {
private static final long serialVersionUID = 1L;
private String email,mdp;
private Utilisateur user;
private boolean LoggedIn;
private List<Ferme> liste;
private Ferme ferme = new Ferme();
@Inject
UtilisateurDao utilisateurDao;
public Ferme getFerme() {
return ferme;
}
public void setFerme(Ferme ferme) {
this.ferme = ferme;
}
public void setListe(List<Ferme> liste) {
this.liste = liste;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMdp() {
return mdp;
}
public void setMdp(String mdp) {
this.mdp = mdp;
}
public Utilisateur getUser() {
return user;
}
public void setUser(Utilisateur user) {
this.user = user;
}
public boolean isLoggedIn() {
return LoggedIn;
}
public void setLoggedIn(boolean loggedIn) {
LoggedIn = loggedIn;
}
public String authentification() {
if (utilisateurDao.login(email, mdp) != null) {
user = utilisateurDao.login(email, mdp);
LoggedIn = true;
return "listeFermes.xhtml?faces-redirect=true";
}
LoggedIn = false;
FacesMessage message = new FacesMessage( "Wrong E-mail or Password!" );
FacesContext.getCurrentInstance().addMessage( null, message );
return "";
}
public String logout() {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("You are disconnected!"));
ExternalContext externalContext = context.getExternalContext();
externalContext.getFlash().setKeepMessages(true);
externalContext.invalidateSession();
return "/login.xhtml?faces-redirect=true";
}
public void deleteFerme(int id) {
utilisateurDao.supprimerFerme(user, id);
}
public void addFerme() {
utilisateurDao.creerFerme(ferme, user);
}
public List<Ferme> getListe() {
return liste;
}
@PostConstruct
public void init(){
liste = utilisateurDao.lister(user);
}
@SessionScope
public class LoginBean {
..
..
public void addFerme() {
utilisateurDao.creerFerme(ferme, user);
}
}
//////..... and then in the RequestScoped bean :
@RequestScoped
..
..
@Inject
private LoginBean loginBean;
public void addFerme() {
loginBean.addFerme();
}
@Stateless
public class UtilisateurDao {
@PersistenceContext( unitName = "MyBD_PU" )
private EntityManager em;
public Utilisateur login(String email, String mdp) throws DAOException {
Utilisateur user = null;
Query requete = em.createQuery( JPQL_LOGIN );
requete.setParameter( PARAM_EMAIL, email ).setParameter(PARAM_PWD, mdp);
try {
user = (Utilisateur) requete.getSingleResult();
if (user!=null) {
return user;
}
return null;
} catch ( NoResultException e ) {
return null;
} catch ( Exception e ) {
FacesMessage message = new FacesMessage( FacesMessage.SEVERITY_ERROR, e.getMessage(), null );
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage( null, message );
}
return user;
}
}