Поддерживать сеанс в Java с jsf и ManagedBean

Инициализируясь с 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?

1
задан 07.05.2016, 00:13
2 ответа
  1. Гораздо более рекомендуется использовать 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 { ... }
    
  2. Все виды, которые будут pasivada (последовательно преобразованная и сохраняемая к жесткому диску), как это случай backing beans, который есть scopes у ViewScoped, SessionScoped, FlowScoped, ConversationScoped, ApplicationScoped должны быть serializables, потому что CDI последовательно преобразованы. Твой класс UsuarioSessionBean он не serializable.

    @Named
    @SessionScoped
    public class UsuarioSessionBean implements Serializable { ... }
    
  3. Выбери 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
}

ОБНОВЛЕНИЕ

В приложении для Андроид де Стаккексчанхе он появился у меня, как "включи", сейчас я увидел дату и он мая. Извините из-за неразберихи.

1
ответ дан 24.11.2019, 14:28
  • 1
    Спасибо за отрицательный обет – gugadev 13.06.2016, 18:23
  • 2
    Спасибо за explicaci и # 243; n, проблема уже resolv и # 237; но твои замечания будут служить для того, чтобы изучить новые вещи. – Maske 13.06.2016, 18:26
  • 3
    Спасибо за selecci и # 243; n. Приветствие коллега. – gugadev 13.06.2016, 18:37

Я реализовал 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, чтобы видеть прямо различные формы, что ты можешь делать их.

1
ответ дан 24.11.2019, 14:28