Gleiche Session von EJB Container in JSF Container verwenden?

internet

Top Contributor
Hallo,

ich versuche mich schon seit einigen Stunden daran, dass ich meine HTTP Session in meiner JSF - Seite bekomme.

Ich habe folgendes Szenario:
- Ich rufe in meinem EJB Container eine JSF - Seite in meiner Applikation auf, womit ich später mein PDF generiere...
- Nun möchte ich diese JSF Seite aber mit der gleichen Session aufrufen, wie im EJB... Derzeit ist es aber so, dass im JSF Controller der "Subject currentUser" nicht eingeloggt ist.

Wie kann ich das denn machen?
Ggf. sei noch dazu gesagt, dass ich Apache Shiro verwende.

Hier ein Code Ausschnitt:
Java:
public PipedOutputStream createPdf(PipedOutputStream os, DocumentDesigner documentDesigner, ObjectForReplacementObject objectReplacement, boolean preview)
            throws IOException, DocumentDesignerNotFoundException {

        LOGGER.info("START createPdf");

        Subject currentUser = permissionSystemUserServiceStoredBean.getSystemUser();
        
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                try {

                    String url = "http://localhost:8080/mypage"
                    PdfRendererBuilder builder = new PdfRendererBuilder();

                    Document doc = html5ParseDocument(url, 0);
                    builder.withW3cDocument(doc, url);

                    builder.toStream(os);
                    builder.run();

                    os.close();
                }

                catch (Exception e) {
                    LOGGER.error(ExceptionUtils.getFullStackTrace(e));
                }
            }
        };
        
        myRunnable = currentUser.associateWith(myRunnable);

        managedExecutorService.submit(myRunnable);
        return os;
    }

    private Document html5ParseDocument(String urlStr, int timeoutMs) throws IOException {

        if (urlStr == null)
            return null;

        URL url = new URL(urlStr);
        org.jsoup.nodes.Document doc;

        doc = Jsoup.parse(url, timeoutMs);

        // Should reuse W3CDom instance if converting multiple documents.
        return new W3CDom().fromJsoup(doc);
    }

Kann hier bitte jemand helfen?
 
Wieso greift Deine Logik auf die Prästentation zu?

Wie oben beschrieben:
- Ich generiere eine PDF im EJB Layer auf Basis einer vorhandenen JSF Seite in meiner App.
- In der URL gebe ich eben noch ein paar Parameter mit, damit die richtigen Dinge in der JSF - Seite angezeigt werden, die ich anzeigen möchte.
- Abschließend wird die JSF in ein PDF konvertiert.

Die Generierung soll im EJB Container stattfinden. Es ist nicht so, dass ein Button vom User in der Präsentationsschicht gedrückt wird o.ä.
 
Code und Problemstellung sehen nur ein bisschen bekannt aus 🙂
achso. Ja, das war meine Inspiration 🙂

Das Problem ist leider dennoch nicht gelöst....
 
Wie oben beschrieben:
- Ich generiere eine PDF im EJB Layer auf Basis einer vorhandenen JSF Seite in meiner App.
- In der URL gebe ich eben noch ein paar Parameter mit, damit die richtigen Dinge in der JSF - Seite angezeigt werden, die ich anzeigen möchte.
- Abschließend wird die JSF in ein PDF konvertiert.

Die Generierung soll im EJB Container stattfinden. Es ist nicht so, dass ein Button vom User in der Präsentationsschicht gedrückt wird o.ä.

Was funktionieren könnte: lies die Session-ID aus und setze beim Abruf den JSESSIONID-Cookie entsprechend.
 
Du meinst sowas in der Art:

Java:
String url = ""localhost:8080/mypage.jsf + ";JSESSIONID=" + currentUser.getSession().getId().toString() + ?myparameter=123456
 
Warum denn überhaupt der Weg über JSF? Das klingt ein bisschen umständlich, von daher würde ich da nach einfacheren Varianten Ausschau halten. ZB mir Jasper-Reports oder ner eingebetteten Template-Engine für HTML.

Soll der Nutzer denn auch direkt die JSF-Seite sehen könne oder ist die nur für die PDF-Generierung gedacht?
 
Warum denn überhaupt der Weg über JSF? Das klingt ein bisschen umständlich, von daher würde ich da nach einfacheren Varianten Ausschau halten. ZB mir Jasper-Reports oder ner eingebetteten Template-Engine für HTML.

Soll der Nutzer denn auch direkt die JSF-Seite sehen könne oder ist die nur für die PDF-Generierung gedacht?
Ne, die JSF Seite ist nur für das Rendering der PDF gedacht...

Die JSF Seite ist mein Template. Ich rufe hier eine Bean auf, die mir dann Objekte zurückgibt.
Diese wiederum geben mir den HTML Code und Position zurück. Das funktioniert auch alles ganz gut.

Problem ist eben das mit der Session. Wenn ich zum Beispiel einen QR - Code via Primefaces einbinde, bekomme ich eine Fehlermeldung, da das Session Objekt wohl nicht gefüllt ist.
 
Ok, habe es nun so gemacht:

Java:
Subject currentUser = permissionService.getSystemUser();
doc = Jsoup.connect(urlStr).cookie("JSESSIONID", currentUser.getSession().getId().toString()).get();

Document doc = html5ParseDocument(url, 0);
builder.withW3cDocument(doc, url);

Leider geht das immer noch nicht....
Was aber auffällt ist, wenn ich (also den 2. Parameter auf NULL setze):

Java:
builder.withW3cDocument(doc, null);
mache, dann bekomme ich nicht die Exception, dass keine Session beim Rendering vom Primefaces QR besteht.... Aber der QR Code ist aber auch nicht ersichtlich..

Im generierten Document doc sehe ich ebenfalls den generierten Code für den QR Code (ob auf NULL gesetzt oder nicht):
Java:
 <img src="/javax.faces.resource/dynamiccontent.properties.xhtml?ln=primefaces&amp;v=8.0&amp;pfdrid=1cc4421f-c771-4069-8ad4-88ea754033ea&amp;pfdrt=qr&amp;gen=qr&amp;fmt=svg&amp;qrec=L&amp;hrp=bottom&amp;pfdrid_c=true&amp;ori=0">

Wenn ich die JSF - Seite ohne Rendering aufrufe, dann wird der QR - Code angezeigt...
 
Zuletzt bearbeitet:
Keine Ahnung. Mit Jsoup rufst Du ja nur das Dokument ab. Irgendwas müsste das ja noch verarbeiten und rendern. Hier könnte das Problem werden, dass Ressourcen nicht nachgeladen werden oder werden können (z. B. fehlende URL/Cookies), außerdem könnte auch JavaScript einen Strich durch die Rechnung machen.
 
Denke das ist ein Problem mit JavaScript / Primefaces....
Habe es nun mit dem Plugin gelöst:


Vielen Dank
 

Zurück
Oben