# Gleiche Session von EJB Container in JSF Container verwenden?



## internet (12. Feb 2021)

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:

```
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?


----------



## mihe7 (12. Feb 2021)

internet hat gesagt.:


> - Ich rufe in meinem EJB Container eine JSF - Seite in meiner Applikation auf, womit ich später mein PDF generiere...


Wieso greift Deine Logik auf die Präsentation zu?


----------



## internet (12. Feb 2021)

mihe7 hat gesagt.:


> 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 (12. Feb 2021)

@beta20 bist du’s?


----------



## internet (12. Feb 2021)

mrBrown hat gesagt.:


> @beta20 bist du’s?


?


----------



## mrBrown (12. Feb 2021)

internet hat gesagt.:


> ?


Code und Problemstellung sehen nur ein bisschen bekannt aus  





						Objekt von EJB in Controller (CDI) - Klasse füllen?
					

Hallo,  ich habe derzeit das folgende Problem:  Ich generiere in meiner EJB - Klasse eine PDF, welches den Inhalt von einer XHTML - Seite von meiner Applikation nimmt.  D.h. ich rufe eine URL von meiner Applikation auf und der Content wird wiederum in mein PDF geladen.  In meiner Controller -...



					www.java-forum.org


----------



## internet (12. Feb 2021)

mrBrown hat gesagt.:


> Code und Problemstellung sehen nur ein bisschen bekannt aus
> 
> 
> 
> ...


achso. Ja, das war meine Inspiration 

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


----------



## mihe7 (12. Feb 2021)

internet hat gesagt.:


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



Was funktionieren könnte: lies die Session-ID aus und setze beim Abruf den JSESSIONID-Cookie entsprechend.


----------



## internet (12. Feb 2021)

Du meinst sowas in der Art:


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


----------



## internet (12. Feb 2021)

internet hat gesagt.:


> Du meinst sowas in der Art:
> 
> 
> ```
> ...


Das hatte ich schon probiert, bekomme aber einen 400 Http Request


----------



## mrBrown (12. Feb 2021)

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 (12. Feb 2021)

mrBrown hat gesagt.:


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


----------



## mihe7 (12. Feb 2021)

internet hat gesagt.:


> Du meinst sowas in der Art:


Ich meinte als Cookie.


----------



## internet (12. Feb 2021)

mihe7 hat gesagt.:


> Ich meinte als Cookie.


wie kann ich das machen?


----------



## mihe7 (12. Feb 2021)

doc = Jsoup.connect(...).cookie("JSESSIONID", sessionId).get();


----------



## internet (12. Feb 2021)

Ok, habe es nun so gemacht:


```
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):


```
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):

```
<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...


----------



## mihe7 (12. Feb 2021)

internet hat gesagt.:


> Leider geht das immer noch nicht....


Wieso zweimal doc?


----------



## internet (12. Feb 2021)

mihe7 hat gesagt.:


> Wieso zweimal doc?


wo meinst du?

Das hier:

```
doc = Jsoup.connect(urlStr).cookie("JSESSIONID", currentUser.getSession().getId().toString()).get();
```

passiert in der Methode: 

```
html5ParseDocument(String urlStr, int timeoutMs);
```


----------



## mihe7 (12. Feb 2021)

Ach, so. Ich hatte mich über Zeilen 2 und 4 in Kommentar #16 gewundert


----------



## internet (12. Feb 2021)

mihe7 hat gesagt.:


> Ach, so. Ich hatte mich über Zeilen 2 und 4 in Kommentar #16 gewundert


Ja, war etwas verwirrend.... Dennoch eine Idee woran es liegen könnte?


----------



## mihe7 (12. Feb 2021)

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 (13. Feb 2021)

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









						Plugins: 1D 2D Barcode with ZXing · danfickle/openhtmltopdf Wiki
					

An HTML to PDF library for the JVM. Based on Flying Saucer and Apache PDF-BOX 2. With SVG image support. Now also with accessible PDF support (WCAG, Section 508, PDF/UA)! - Plugins: 1D 2D Barcode w...




					github.com
				




Vielen Dank


----------

