Инициализируясь с Java США и JSF, я нуждаюсь в том, чтобы создать простой login и поддержать id и nick пользователя в сеансе.
Для этого он верит в класс
package Controlador;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class SessionBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1;
private int usuarioId;
private String usuarioNick;
public SessionBean() {
super();
}...
С другого класса я пробую сохранять данные в ней, но когда я пробую соглашаться, возвратись Null pointer exception
.
@ManagedBean
b@SessionScoped
public class UsuarioSessionBean {
@EJB
private UsuarioSessionDAO usuarioSession;
@ManagedProperty("#{sessionBean}")
private SessionBean sessionBean;
public void setSessionBean(SessionBean sb){
if(sb != null){
this.sessionBean = sb;
}
}
...
public String Login(){
Usuario usr = usuarioSession.Login(usuario.getNick(), usuario.getPass());
if(usr != null){
sessionBean.setUsuarioId(usr.getId());
sessionBean.setUsuarioNick(usr.getNick());
return "loginOk";
}
return "loginNo";
}
Что я врежу? или скорее: каковым был бы способ создавать простой login?
Гораздо более рекомендуется использовать beans манипулируемые CDI, чем JSF. Сейчас, использование @ManagedBean
он не является благоразумным. Ваша замена @Named
который он показывает, что это CDI bean. Важно не перемешивать ManagedBeans с scopes CDI, потому что оно просто не будет функционировать, и у тебя будут проблемы во время выполнения.
import javax.inject.Named;
import javax.enterprise.context.SessionScoped; // importante
@Named
@SessionScope
public class SessionBean implements Serializable { ... }
Все виды, которые будут pasivada (последовательно преобразованная и сохраняемая к жесткому диску), как это случай backing beans, который есть scopes у ViewScoped, SessionScoped, FlowScoped, ConversationScoped, ApplicationScoped должны быть serializables, потому что CDI последовательно преобразованы. Твой класс UsuarioSessionBean
он не serializable.
@Named
@SessionScoped
public class UsuarioSessionBean implements Serializable { ... }
Выбери scope (область, достижение) твоих backing beans правильной формы. Если у тебя будет много beans в сеансе, приложение потеряет результат, потому что в каждом ответе ты посылаешь все эти beans.
Например, ты можешь создавать утилитарный класс, который позволял бы тебе получать и добавлять стоимость к сеансу.
public class SessionUtils implements Serializable {
public void add(String key, Object value) {
FacesContext.getCurrentInstance().getSessionMap().put(key, value);
}
public void get(String key) {
FacesContext.getCurrentInstance().getSessionMap().get(key);
}
}
И ты не нуждаешься UsuarioSessionBean
, только драйвер login, которому он делал инъекцию бы SessionUtils
.
@Named
@RequestScoped
public class LoginBean {
@Inject // inyectamos la dependencia
private SessionUtils session;
private String username;
private String password;
public String login() {
// comprobar credenciales
if(exito) {
// añades el usuario a sesión
sessionUtils.add("usuarioLogueado", usuario);
return "home";
}
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Acceso denegado", "Usuario o contraseña incorrecta");
// como mensaje global
FacesContext.getCurrentInstance().addMessage(null, message);
return null; // retorna al mismo login
}
// getters y setters
}
В приложении для Андроид де Стаккексчанхе он появился у меня, как "включи", сейчас я увидел дату и он мая. Извините из-за неразберихи.
Я реализовал login с API Google Oauth2 это то же самое, что и ты хочешь сделать, но вместо того, чтобы перемещать изменчивых Session, ты будешь должен перемещать две переменные "login" и "password"
login.xhtml
<h:commandLink action="#{loginBean.sessGmail()}" ajax="false" type="submit">
<h:graphicImage library="resources" name="images/iconGmailBlack.png" style="width: 150px; height: 150px; "/>
<f:param name="idParamtro" value="#{loginBean.Login}" />
</h:commandLink>
LoginBean.java
....
private Session Login;
public Session getLogin() {
return Login;
}
public void setLogin(Session userLog) {
this.userLog = Login;
}
....
MainLogin.java
.....
@ManagedBean
@SessionScoped
public class MainBean {
@ManagedProperty(value="#{loginBean}")
private LoginBean userLogin;
@PostConstruct
public void init() {
/** Se carga el Login en una variable de MainBean*/
"variableMainBean" = userLogin.getLogin();
...}
...}
Кроме того ты должен конфигурировать фильтры приложения, чтобы не мочь соглашаться на одну унифицированный указатель ресурса приложения прямо.
Это для того, чтобы ты сделал себе идею о структуре вызовов, чтобы делать login. Есть бесконечные способы делать login, так как ты можешь помещать API третьих, как которая использованный я, чтобы реализовывать login, кроме того, что делаешь все виды проверок с bbdd, и т.д.
Если он помогает тебе, есть несколько руководителей (Испанец) в youtube, чтобы видеть прямо различные формы, что ты можешь делать их.