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?
 

internet

Top Contributor
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.ä.
 

mrBrown

Super-Moderator
Mitarbeiter

internet

Top Contributor
Code und Problemstellung sehen nur ein bisschen bekannt aus :)
achso. Ja, das war meine Inspiration :)

Das Problem ist leider dennoch nicht gelöst....
 

mihe7

Top Contributor
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.
 

internet

Top Contributor
Du meinst sowas in der Art:

Java:
String url = ""localhost:8080/mypage.jsf + ";JSESSIONID=" + currentUser.getSession().getId().toString() + ?myparameter=123456
 

mrBrown

Super-Moderator
Mitarbeiter
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?
 

internet

Top Contributor
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.
 

internet

Top Contributor
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:

internet

Top Contributor
Wieso zweimal doc?
wo meinst du?

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

passiert in der Methode:
Java:
html5ParseDocument(String urlStr, int timeoutMs);
 
Zuletzt bearbeitet:

mihe7

Top Contributor
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.
 

internet

Top Contributor
Denke das ist ein Problem mit JavaScript / Primefaces....
Habe es nun mit dem Plugin gelöst:


Vielen Dank
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Session löschen Web Tier 3
J Session ist nach Klick auf Zurück-Button wieder aktiv Web Tier 3
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
J Session Servlet - JavaScript Web Tier 6
M Session closed - und nun? Web Tier 1
F JSF synchronized(session) Frage ? Web Tier 1
F JSF p:selectOneMenu Session Web Tier 10
T JSF Problem wenn Session abgelaufen ist Web Tier 6
Q JSF bei Session-Timeout Weiterleitung auf spezielle Login-Seite Web Tier 15
D JSF Überprüfen der Session ID in JSF und JAVA Web Tier 9
R Servlet Resource laden für SMTP - Session Web Tier 4
B JSF Mojarra 2.1.5: java.lang.IllegalStateException: Cannot create a session after the response has been Web Tier 7
R JSF Session Handling Web Tier 3
X JSP Auslesen der Daten einer Session Web Tier 3
X Managed Bean Scope zwischen Request und Session gesucht Web Tier 6
crashfinger JSP Session verloren bei DNS Servernamen & IE Web Tier 6
C session trackung auf einfacher web-site Web Tier 17
F JSF Session-Kolision Web Tier 3
R Zugriff auf Session direkt auf JSF-Seite Web Tier 2
H JSF Session Initialisierung Web Tier 2
E JSP Browser Tab Session Web Tier 7
F Session Tutorial Web Tier 5
T JSP Session Login - Sicherheit Web Tier 4
J Loginbereich mit Session und Datenbank Web Tier 5
M 2 Cookies in der session (cocoon 2.2) Web Tier 4
F Richtiges Session Management mit Servlets Web Tier 4
P JSP: Liste in Bean über Session aufbauen Web Tier 6
7 Struts+AJAX- Session-Handling? Web Tier 2
B JSF session bean mit worker thread updaten Web Tier 7
J Crash bei session timeout Web Tier 3
M session Speicherort - ID ändern Web Tier 8
V ANFÄNGER : eigene Session Web Tier 3
V DatenbankConnection an Session hängen Web Tier 4
P session.removeAttribute Web Tier 3
K Orientierungslosigkeit: Webservice+Ajax(echo2)+Session-Management Web Tier 4
O struts - Gültigkeit einer Action an Session binden?! Web Tier 4
D JSF: Best Practice "Session invalidate nach Schließen des Browsers"? Web Tier 3
T Unbegrenzte Session Web Tier 14
D tapestry 5 session Web Tier 2
J Struts 2 session ID auslesen? Web Tier 5
M [J2EE] Session-Save Static-Objects? Web Tier 6
S Problem mit Session - Übergabe von Kontext zu Kontext Web Tier 2
F JSF: Beans in Session oder Request? Web Tier 4
H JSF - Bean (scope session) - Verfallsdatum? Web Tier 3
T Problem bei Session-Timeout Web Tier 3
M JSF refresh vs. session scope Web Tier 9
G Session in Servlet Starten und mit JSTL auslesen Web Tier 2
G Servlet - Von Parametern umstellen auf Session Web Tier 8
G jsf session erstellen Web Tier 10
rambozola session attribut in servlets und jsps Web Tier 11
M JSF session.invalidate() klappt nicht Web Tier 3
G Session.invalide() funktioniert nicht richtig Web Tier 2
Dimax JSP JSP div Container ein- und ausblenden Web Tier 1
D Struts 2 , DIV Container mit verschiedner Farbe Web Tier 2
ruutaiokwu template engine gesucht ohne abhängigkeit zum servlet container Web Tier 2
S Laden von globalen Resourcen im Servlet Container..? Web Tier 3
P Simpler HTTP-Container in JBOSS - Geht das? Web Tier 8

Ähnliche Java Themen

Neue Themen


Oben