Czy to natywne metody interfejsu SessionBean w EJB ?

0

Witam,

Piszę (..a przynajmniej zamierzam to zrobić...) obecnie Managedbeana w JSF/EJB zajmującego się logowaniem użytkowników do aplikacji
po prawidłowej ich rejestracji oraz zapisie w bazie danych
.
Korzystam z pewnego gotowego szkieletu takiego rozwiązania w Java i natknąłem się na problem a mianowicie, iż
po zaimportowaniu do klasy poniższych koniecznych standardowych pakietów :

import javax.ejb.EJB;
import javax.ejb.**SessionBean;**
import javax.ejb.SessionContext;
import javax.faces.bean.SessionScoped;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;


@ManagedProperty(value="#{sessionBean}")
    private SessionBean sessionBean;

metody związane z obsługą logowania oraz zapisywaniem danych sesji świecą się na czerwono i nie da się zaimportować żadnej klasy.
.
Zatem czy **to nie są **metody natywne dla interfejsu SessionBean ?
.
Czy oznacza to że należy samemu utworzyć beana SessionBean i napisać tam 'czerwone' metody ?
.
Czy np. writeSessionData(request, user) to metoda która powinna zapisywać dane sesji np. do kontenera Map ?
.
Załączam dla ułatwienia zrzuty skrinów z tym miejsc beana , gdzie te metody występują, żeby nie zaciemniać obrazu.

?

0

A czy może podpowiecie , dlaczego kompilator wyrzuca błąd poniższy z wiązany z brakiem widoczności metody login() ?

*cannot find symbol
[ERROR] symbol: method login(java.lang.String,java.lang.String)
[ERROR] location: variable request of type javax.servlet.http.HttpServletRequest
*

To jest natywna metoda HttpServletRequest request , która przyjmuje argumenty : np String :login, password.
Czy należy tę metodę samemu napisać pod kątem np. znalezienia pasujących danych w bazie danych , czy ona zajmuje się tylko uwierzytelnieniem danych logowania ?
.
A może inaczej : czy Ktoś z Was mógłby przełożyć na 'ludzki' opis ze specyfikacji :
"
login

void login(java.lang.String username,
java.lang.String password)
throws ServletException

Validate the provided username and password in the password validation realm used by the web container login mechanism configured for the ServletContext.
"

0

Przepraszam, macie rację.
Już zamieszczam cały kod , a pod nim pytania :

@ManagedBean

@RequestScoped

public class LoginBean implements Serializable {

private static final long serialVersionUID = 5582641298743595112L;

public static final String REDIRECT_URL = "manager.xhtml";

Logger logger = Logger.getLogger(LoginBean.class.toString());


@ManagedProperty("#{sessionBean}")
public SessionBean sessionBean;

@ManagedProperty(value = "#{studentDatabaseBean}")
public StudentService studentService;

@EJB
StudentDao studentDao;

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

private String login;

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

private String password;

public LoginBean() {
}

@PostConstruct
public void init() {
    logger.info("LoginBean.init - invoke");

    if (sessionBean.isLogged()) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect(REDIRECT_URL);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "LoginBean.init - IOException", e);
        }
    }
}


public String login() {

    logger.info(String.format("LoginBean.login - invoke,login));

    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

    try {

        EntityManager em = studentService.getInstanceOfEntityManager();

        Student student = (new DataBaseSelectorFactory()).findSensitiveData(getLogin(), em, "login");


        if (student == null) {
            sessionBean.showError("Błędny login lub hasło.");
            return null;
        }
        if (accountDao.authorize(login, password) == null) {
            sessionBean.showError("Błędny login lub hasło.");
            return null;
        }

        request.login(login, password);

        logger.info("login, student validated.");

        writeSessionData(request, student);
    } catch (Exception e) {
        sessionBean.showError("Błędny login lub hasło.");
        logger.log(Level.SEVERE, "LoginBean.login - DaoException (student not found)", e);
        return null;
    }

    return Navigation.HOMEPAGE;
}


public String logout() {
    logger.info("Coś tam, coś tam...");
    HttpServletRequest request = (HttpServletRequest)
            FacesContext.getCurrentInstance().getExternalContext().getRequest();
    sessionBean.logout();
    try {
        request.logout();
    } catch (ServletException e) {
        logger.log(Level.SEVERE, "LoginBean.logout - ServletException", e);
        return null;
    } catch (Exception e) {
        logger.log(Level.SEVERE, "LoginBean.logout - error", e);
        return null;
    }
    return Navigation.LOGIN;
}

public void reset(ActionEvent event) {
    login = "";
    password = "";
}

}

  1. Czy metody login, logout , authorize , showError, writeSessionData muszę zdefiniować w klasie/interfejsie SessionBean ?

  2. login, logout to metody natywne dla HttpServletRequest , dlaczego zatem pomimo importu odpowiednich pakietów, środowisko IDEA
    zaznacza je na czerwono ?

  3. W jaki sposób zapisywać dane sesji (do czego) np . do tabeli bazy danych, do kontenera MAP, ....?

...dzięki Wam za zerknięcie.

1

Chyba mylisz interfejs SessionBean z klasą HttpServletRequest. To nie jest to samo. Pokaż ten screen z IntelliJ, gdzie masz na czerwono login z HttpServletRequest. Bo screen logbean3 tego nie pokazuje.

Co do metody login nie pomogę Ci. Nie wiem, jak się tego używa. Musiałbyś poczytać w dokumentacji servletów. Łatwo nie będzie :)

No i zanim coś napiszesz dalej, to poskładaj do kupy ten poprzedni post. Przecież widzisz, że formatowanie się rozjechało. Przez to nikt nie przebrnie.

0

...nie jest 'red' tylko rzuca wyjątkiem :

cannot find symbol
[ERROR] symbol: method login(java.lang.String,java.lang.String)
[ERROR] location: variable request of type javax.servlet.http.HttpServletRequest

Screen już zamieszczam : nr 4.

...i 'poskładałem' tak jak umiałem - :).

0

Nie jestem pewien czy ci to coś pomoże, ale ja pamiętam że z tym całym javax servlet api było często sporo dziwnych problemów, nie wiem, czy korzystasz z
https://mvnrepository.com/artifact/javax.servlet/servlet-api ? Lub nowszego
https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api ?

0

Maven w zasobach wskazuje na poniższą wersję :

C:\Users\user.m2\repository\javax\servlet\javax.servlet-api\3.1.0

0

Pokombinuj z tym <scope>provided</scope> - jeśli to masz to usuń i przetestuj, a jeśli nie masz, to dodaj i przetestuj :D

2
import javax.ejb.SessionBean;

@ManagedProperty("#{sessionBean}")
public SessionBean sessionBean;

SessionBean jest interfejsem. Nie ma sensu jego wstrzykiwanie (nie wiem nawet co próbujesz stworzyć - ale to nie ma żadnego sensu).
Nie ma też żadnych metod login, showError i tym podobnych.

A powracając do moich typowych złośliwości - jak chcesz się uczyć czegoś starego i bezużytecznego, to opanowanie pisma hieratycznego z okresu wczesnodynastycznego IMO jest o wiele bardziej szpanerskie niż EJB.

0
jarekr000000 napisał(a):
import javax.ejb.SessionBean;

@ManagedProperty("#{sessionBean}")
public SessionBean sessionBean;

SessionBean jest interfejsem.

Niestety tak miałem podane w instrukcji, iż SessionBean jest beanem sesyjnym (klasą + adnotacje).

Nie ma sensu jego wstrzykiwanie (nie wiem nawet co próbujesz stworzyć - ale to nie ma żadnego sensu).

Chciałbym :

  1. utworzyć beana Logującego/Wylogowującego - Login Bean zajmującego się walidacją logowania pod kątem zgodności w bazie danych + komunikaty walidacyjne + serwowanie stron kontekstowo zgodnych z userem (studentem) xhrml po pomyślnej walidacji /wylogowaniu
    .
  2. utworzenia managera sesji (singletona) serwującego sesje indywidualne dla userów i przechowującego w Mapie atrybuty sesji
    .
  3. całość bez adnotacji w plikach xml takich jak : - standalone na serwerze + web w aplikacji = programowo zarządzam serwowaniem stron
    typu secure na podstawie atrybutów sesji w managerze.

Nie ma też żadnych metod login, showError i tym podobnych.

Tak , już to zauważyłem i zdefiniowałem je w SessionBean .

....szpanerskie niż EJB.

Cały czas się uczę - stąd obecność na forum.
Nie pragnę na nikim zrobić wrażenia, zapewniam.

Pozdrawiam.

0

–Stanowy bean utworzony dla usera, wystawia stronę logowania index.xhtml
.
-Bean singleton(kontener) kreuje beana Sesyjnego SessionScope dla usera, po sprawdzeniu czy czasem nie ma już wpisu o sesji w swoich zasobach Map oraz czy dane logowania zgodne z bazą danych - jak nie to zwraca null.
.
–Bean singleton(kontener) przechowuje mapę stanowych/sesyjnych beanów userów, którzy już się zalogowali, zapisuje w kontenerze hashMap<'ID sesji + timestamp', 'dane Beana Sesyjnego'>
.
–Bean sesyjny udostępnia userowi stronę z jego 'danymi wrażliwymi' = konto, dane etc.
.

  • Rezygnuję z ustawień serwerowych i aplikacyjnych dla HttpServletRequest request = (HttpServletRequest) oraz stron secure dla któych wymagane jest logowanie.

Rozumiem, że powyższe założenia są błędne ?

0

"Po co ci ten bean sesyjny? "
.
Bean sesyjny konieczny do zapewnienia obsługi stron 'wrażliwych' , w następnych krokach kreowanie różnych stron xhtml właściwych tylko dla usera
do których nie ma dostępu nikt inny.
.
Obecnie ustawiłem w kodzie tak, że po podaniu poprawnych danych profilu i zgodnych z bazą
wyświetlam stronę administracyjną aplikacji - lista klientów.
Ale to na razie...
.
Potem tylko dane właściwe dla Klienta.
.
Jak zrobię powyższe , to muszę zapewnić 'jakisik' mechanizm programowy, który 'dba' o SessionScope dla usera via SessionBean + Manager Beans
i 'ubijanie sesji automatem', , badanie czy user zalogowany aby nie zmuszać go do ponownego logowania itd.
.
Może ja źle kombinuję ?

3
JavaRookie napisał(a):

–Stanowy bean utworzony dla usera, wystawia stronę logowania index.xhtml

Coooo ? Jeszcze nie widziałem beana co by wystawiał stronę.

  • Rezygnuję z ustawień serwerowych i aplikacyjnych dla HttpServletRequest request = (HttpServletRequest) oraz stron secure dla któych wymagane jest logowanie.

Cooo ??? ( I tak do każdej linijki twojego postu)

Rozumiem, że powyższe założenia są błędne ?

Nie tyle błędne co masz jakiś totalny mętlik pojęciowy. Wziąłeś się za naukę zupełnie kupowatych technologii i to jeszcze z przestarzałego podręcznika do nich.
(serio, te SessionBeany to były stare już w 2008 - 10 lat temu). SessionBeany nie mają nic wspólnego z sesją HTTP, którą niejako próbujesz stworzyć - a ona już jest (np. jako SessionScoped beany)
Nie mógłbyś się uczyć czegoś normalnego co działa? A dopiero po tym - douczyć się JSF i EJB. Dla dużej kasy i radosci grzebania się w starym i nietestowalnym kodzie, którego autorzy uciekli do lepszych firm.
Teraz to Ci tylko mózg wyżera.

0

Technologia to JSF 2.2 EE EJB plus Primefaces JSF.
Nie wiedziałem ze jest aż tak stara i nikt jej nie używa.
.
Bean zwraca String strony xhtml w metodzie walidacyjnej kontrolera.
......skrót myślowy , tyle.

0

Tych technologii to się jeszcze używa, ale są stare.
Kiepskie, bo powstały do rozwiązania problemów, których już nie ma, natomiast słabo pomagają przy nowoczesnych aplikacjach.
Szczególnie JSF jest bardzo, bardzo złe. A EJB to po prostu zwykła kiepucha.

Te technologie zupełnie nie nadają się na start, jeśli nie masz już sensownego doświadczenia w javie.
Początki w java, a technolog...

0
jarekr000000 napisał(a):

Tych technologii to się jeszcze używa, ale są stare.
Kiepskie, bo powstały do rozwiązania problemów, których już nie ma, natomiast słabo pomagają przy nowoczesnych aplikacjach.
Szczególnie JSF jest bardzo, bardzo złe. A EJB to po prostu zwykła kiepucha.

Te technologie zupełnie nie nadają się na start, jeśli nie masz już sensownego doświadczenia w javie.
Początki w java, a technolog...

.

W każdym razie dzięki za uwagi.

0

Witaj,
Czy rozwiązałeś już ten problem? Mam bardzo podobną sytuację i bardzo podobny problem i zero pojęcia jak to rozwiązać.
W ogóle masz coś wspólnego z AGH/PAW? Kod który mam jest niemal identyczny...

0
krakus napisał(a):

Witaj,
Czy rozwiązałeś już ten problem? Mam bardzo podobną sytuację i bardzo podobny problem i zero pojęcia jak to rozwiązać.
W ogóle masz coś wspólnego z AGH/PAW? Kod który mam jest niemal identyczny...

..no własnie nie , nie wiem jak 'spiąć' wpisy na stronie logowania xhtml z Beanem do logowania , tak by chronione były (logowaniem) odwołania
do stron w folderze /secure/*.xhtml na na serwerze wildfly.

Może prowadzący poda właściwe rozwiązanie ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1