<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java Archive - Das ist die Welt von Thomas</title>
	<atom:link href="https://www.schiffler.eu/thema/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.schiffler.eu/thema/java/</link>
	<description>meine Gedanken, mal strukturiert, mal nicht ...</description>
	<lastBuildDate>Fri, 26 Feb 2021 14:25:43 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://www.schiffler.eu/wp-content/uploads/2025/07/cropped-Profilfoto_2024-32x32.png</url>
	<title>Java Archive - Das ist die Welt von Thomas</title>
	<link>https://www.schiffler.eu/thema/java/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Spring Boot mit SSL Zertifikat von LetsEncrypt unter Debian 10</title>
		<link>https://www.schiffler.eu/spring-boot-mit-ssl-zertifikat-von-letsencrypt-unter-debian-10/</link>
					<comments>https://www.schiffler.eu/spring-boot-mit-ssl-zertifikat-von-letsencrypt-unter-debian-10/#respond</comments>
		
		<dc:creator><![CDATA[Thomas Schiffler]]></dc:creator>
		<pubDate>Fri, 12 Mar 2021 12:40:00 +0000</pubDate>
				<category><![CDATA[IT-Know How]]></category>
		<category><![CDATA[certbot]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Homeserver]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[LetsEncrypt]]></category>
		<category><![CDATA[Spring-Boot]]></category>
		<guid isPermaLink="false">https://www.schiffler.eu/?p=1271</guid>

					<description><![CDATA[<p>Wie bereits erwähnt habe ich mir zuhause einen neuen Homeserver aufgebaut. Auf diesem laufen diverse Anwendungen, unter anderem diverse auf &#8230; <a href="https://www.schiffler.eu/spring-boot-mit-ssl-zertifikat-von-letsencrypt-unter-debian-10/" class="more-link">More <span class="screen-reader-text">Spring Boot mit SSL Zertifikat von LetsEncrypt unter Debian 10</span> <span class="meta-nav">&#8594;</span></a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/spring-boot-mit-ssl-zertifikat-von-letsencrypt-unter-debian-10/">Spring Boot mit SSL Zertifikat von LetsEncrypt unter Debian 10</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Wie bereits erwähnt habe ich mir <a href="https://www.schifler.eu/neuer-homeserver-ryzen-9-3900x-mit-64gb" target="_blank" rel="noreferrer noopener sponsored nofollow">zuhause einen neuen Homeserver aufgebaut</a>. Auf diesem laufen diverse Anwendungen, unter anderem diverse auf Spring-Boot basierende Microservices. Die Anwendung ist über einen eigenen Port aus dem Internet erreichbar. Der Traffic wird hierbei über <a href="https://spring.io/projects/spring-cloud-gateway" target="_blank" rel="noreferrer noopener">Spring Cloud Gateway</a> gefiltert und (sofern die Berechtigung vorliegt) auf die einzelnen Systeme weiter geroutet. Eine Herausforderung beim Aufbau lag darin herauszufinden, wie ich Spring-Boot mit SSL Zertifikat von LetsEncrypt unter Debian 10 absichern kann. </p>



<h2 class="wp-block-heading">Spring Boot Anwendung hinter der FritzBox</h2>



<p class="wp-block-paragraph">Wie so viele setze auch ich zuhause eine FritzBox ein. Das ist an dieser Stelle allerdings eigentlich irrelevant, denn die benötigten Features liefert im Grunde jede Router. Damit der Homeserver hinter dem Router aus dem Internet erreichbar ist sind 2 Dinge notwendig:</p>



<div class="wp-block-advgb-list"><ul class="advgblist-4ca13a9f-e724-4362-aa3b-b477e54cb143 advgb-list advgb-list-admin-post"><li>ein dynamischer DNS damit der Server über eine gleichbleibenden Hostnamen erreichbar ist</li><li>die Weiterleitung der definierten Ports vom Router auf den Server</li></ul></div>
<style type="text/css" class="advgb-blocks-styles-renderer">.wp-block-advgb-list ul.advgblist-4ca13a9f-e724-4362-aa3b-b477e54cb143 > li{font-size:16px;}.wp-block-advgb-list ul.advgblist-4ca13a9f-e724-4362-aa3b-b477e54cb143 > li{padding-left:18px;margin-left:0;}.wp-block-advgb-list ul.advgblist-4ca13a9f-e724-4362-aa3b-b477e54cb143 > li:before{font-size:16px;color:#000000;line-height:18px;margin:2px;padding:2px;margin-left:-20px}</style>


<div class="wp-block-image"><figure class="aligncenter size-medium"><a href="https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_1.png"><img fetchpriority="high" decoding="async" width="300" height="200" src="https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_1-300x200.png" alt="Homeserver - Netzwerkarchitektur" class="wp-image-1292" srcset="https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_1-300x200.png 300w, https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_1-360x240.png 360w, https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_1-600x400.png 600w, https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_1.png 656w" sizes="(max-width: 300px) 100vw, 300px" /></a></figure></div>



<p class="wp-block-paragraph">Sobald diese Konfiguration vorgenommen ist kann der Server, sofern denn alles richtig läuft, aus dem Internet auf dem freigeschalteten Port erreicht werden. </p>



<h2 class="wp-block-heading">SSL Zertifikat für DynDNS Eintrag erzeugen</h2>



<p class="wp-block-paragraph">Soweit so gut, doch wie kommen wir nun dazu den Hostname, welchen wir über den DynDNS-Anbieter erhalten haben, über ein SSL Zertifikat zu schützen. Im Idealfall soll das Zertifikat dann auch noch kostenneutral verwaltet werden können. Das Stichwort hierfür lautet LetsEncrypt.</p>



<p class="wp-block-paragraph">Über <a href="https://letsencrypt.org/de/" target="_blank" rel="noreferrer noopener">Let´s Encrypt</a> ist es möglich SSL-Zertifikate mit sauberer Authentifizierungschain zu erstellen, sofern man denn der &#8222;Eigentümer des Servers&#8220; ist, also Administrativen Zugang zu selbigem hat. Das Vorgehen ist recht trivial und <a href="https://letsencrypt.org/de/how-it-works/" target="_blank" rel="noreferrer noopener nofollow">hier sehr plakativ beschrieben</a>.</p>



<h2 class="wp-block-heading">Certbot mit Let´s Encrypt auf Debian 10 einrichten</h2>



<p class="wp-block-paragraph">Die ersten Versuche eine geeignete Lösung zu finden brachten mich ein wenig zur Verzweiflung. Na klar man findet diverse Tutorials im Internet, diese sind jedoch meist für Ubuntu oder für altere Debian Versionen. Ab der Version 10 von Debian ist die auf den meisten Seiten beschriebene Installation des Certbot jedoch nicht mehr möglich da für diese Variante Debian nicht mehr unterstützt wird. </p>



<p class="wp-block-paragraph">Nach ein wenig Recherche dann doch die Lösung, der <a href="https://certbot.eff.org/lets-encrypt/debianbuster-other" target="_blank" rel="noreferrer noopener">Certbot</a> muss lediglich über <a href="https://snapcraft.io/docs/installing-snap-on-debian" target="_blank" rel="noreferrer noopener">snap</a> auf Debian installiert werden. Im Grund nur ein kleiner Umweg welcher genau so zum Ziel führt.</p>



<p class="wp-block-paragraph">Nachdem nun das SSL Zertifikat für die &#8222;eigene&#8220; DynDNS-Domain eingerichtet wurde kann dieses in einen Keystore für die Java-Anwendung gelegt werden.  Dies geschieht über den folgenden Befehl:</p>



<pre class="wp-block-code"><code>openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name &lt;applicationName&gt; -CAfile chain.pem -caname root -passout pass:&lt;keystorePass&gt;</code></pre>



<p class="wp-block-paragraph">Da der Certbot das SSL-Zertifikat regelmäßig erneuert (min. alle 3 Monate) habe ich das Kommando zur Aktualisierung des Keystores in einen Cronjob gepackt. Somit sorge ich dafür dass der Keystore immer über das aktuellste Zertifikat verfügt.</p>



<h2 class="wp-block-heading">Spring Boot mit SSL Zertifikat &#8211; Konfiguration</h2>



<p class="wp-block-paragraph">In Projekten in welchen ich Spring-Boot einsetze versuche ich, die eigentlichen Anwendungen nicht völlig für die Anwender zu öffnen. Ich habe mir angewöhnt, die einzelnen Microservices hinter einem Gateway &#8222;zu verstecken&#8220;. Dieses Gateway (Spring Cloud Gateway) nimmt alle Aufrufe entgegen, prüft Berechtigungen und Aufbau der Aufrufe. Somit werden nur gültige Requests an die einzelnen Services weiter geroutet.</p>



<div class="wp-block-image"><figure class="aligncenter size-medium"><a href="https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_2.png"><img decoding="async" width="300" height="141" src="https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_2-300x141.png" alt="Homeserver - Anwendungsarchitektur mit SSL" class="wp-image-1291" srcset="https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_2-300x141.png 300w, https://www.schiffler.eu/wp-content/uploads/2021/02/homeserver_network_2.png 696w" sizes="(max-width: 300px) 100vw, 300px" /></a></figure></div>



<p class="wp-block-paragraph">Durch diesen Ansatz geht der gesamte Traffic über das Gateway. Dieses ist also die einzige Anwendung die direkt von außen aufgerufen werden kann. Somit genügt es, aus externer Sicht, dieses Gateway mit einem SSL-Zertifikat auszustatten. Um diese Konfiguration durchzuführen passen wir nun noch die application.yaml an und fügen den Bereich der SSL-Konfiguration hinzu:</p>



<pre class="wp-block-code"><code>server:
  port: &lt;portAusForward&gt;
  ssl:
    enabled: true
    key-store-type: PKCS12
    key-store: /home/ssl/keystore/keystore.p12
    key-store-password: &lt;keystorePass&gt;
    key-alias: &lt;applicationName&gt;</code></pre>



<p class="wp-block-paragraph"></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/spring-boot-mit-ssl-zertifikat-von-letsencrypt-unter-debian-10/">Spring Boot mit SSL Zertifikat von LetsEncrypt unter Debian 10</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.schiffler.eu/spring-boot-mit-ssl-zertifikat-von-letsencrypt-unter-debian-10/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Zahlungseingänge automatisiert prüfen – auch ohne HBCI</title>
		<link>https://www.schiffler.eu/zahlungseingaenge-automatisiert-pruefen-auch-ohne-hbci/</link>
					<comments>https://www.schiffler.eu/zahlungseingaenge-automatisiert-pruefen-auch-ohne-hbci/#respond</comments>
		
		<dc:creator><![CDATA[Thomas Schiffler]]></dc:creator>
		<pubDate>Mon, 27 Jan 2014 18:37:20 +0000</pubDate>
				<category><![CDATA[IT-Know How]]></category>
		<category><![CDATA[Banking]]></category>
		<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[HBCI]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://thomas.schiffler.eu/?p=14</guid>

					<description><![CDATA[<p>Jeder der Rechnungen an seine Kunden schreibt hat die Herausforderung den Zahlungseingang der selbigen zu überwachen und im schlimmsten Fall &#8230; <a href="https://www.schiffler.eu/zahlungseingaenge-automatisiert-pruefen-auch-ohne-hbci/" class="more-link">More <span class="screen-reader-text">Zahlungseingänge automatisiert prüfen – auch ohne HBCI</span> <span class="meta-nav">&#8594;</span></a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/zahlungseingaenge-automatisiert-pruefen-auch-ohne-hbci/">Zahlungseingänge automatisiert prüfen – auch ohne HBCI</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jeder der Rechnungen an seine Kunden schreibt hat die Herausforderung den Zahlungseingang der selbigen zu überwachen und im schlimmsten Fall Zahlungserinnerungen, Mahnungen oder sonstige nächste Schritte einleiten zu müssen. Damit dies möglich ist muss im Idealfall mehrmals täglich das Konto auf neue Zahlungseingänge geprüft werden. Betreiber von reinen Onlinesystemen / Onlineshops stehen vor der selben Herausforderung nur mit der Ausnahme, dass die Anzahl der auf Zahlungseingang wartenden Bestellungen deutlich höher ist. Der manuelle Aufwand zur Prüfung auf offene Zahlungen verschlingt eine Menge Zeit – also muss eine möglichst einfache Softwarelösung her.</p>



<p class="wp-block-paragraph">Auch ich stand nach dem Wechsel meiner Hausbank erneut vor der Herausforderung mein&nbsp;eigenes Rechungs- / Buchhaltungssystem&nbsp;an die neuen Gegebenheiten anzubinden. Also los gehts …</p>



<h2 class="wp-block-heading">Der Standardweg: Umsätze per HBCI abrufen</h2>



<p class="wp-block-paragraph">In der Theorie ist das automatisierte Prüfen auf Zahlungseingänge ein Kinderspiel – immerhin unterstützen die meisten Banken das HBCI-Protokoll welches mit Hilfe der freien Library&nbsp;<a href="http://hbci4java.kapott.org/" target="_blank" rel="noreferrer noopener">HBCI4Java</a>&nbsp;angebunden und z.B. zum Abrufen der Umsatzliste genutzt werden kann. Wir schreiben also eine kleine Java-Klasse, loggen uns automatisiert in der Bank ein, rufen die Umsatzliste ab und schon haben wir was wir brauchen um Weiterzuarbeiten. Ein Beispiel hierfür werde ich mir an dieser Stelle sparen – das Internet ist voll davon. Ein guter Einstieg in die Thematik bringt Ihnen aber die Informationsseite zur&nbsp;<a href="http://hbci4java.kapott.org/" target="_blank" rel="noreferrer noopener">Open-Source-Bibliothek HBCI4Java</a>.</p>



<h2 class="wp-block-heading">Kein HBCI – Was nun?</h2>



<p class="wp-block-paragraph">Was tun wir nun aber wenn unsere Bank kein HBCI unterstützt? Wir vergessen die Idee die Umsätze automatisiert zu lesen und machen das ganze manuell. Kein Problem, dauert pro Tag ja nur eine halbe Stunde – die Zeit habe ich. Nun gut, pro Tag 30 Minuten – in der Woche also „nur“ 4 1/2 Stunden. Haben wir so viel Zeit? Nein, das muss anders gehen.</p>



<p class="wp-block-paragraph">Und ja, es geht anders – warum bringen wir unserer Software nicht einfach bei genau das zu tun, was wir selbst händisch tun? Wir loggen uns über den Browser ein, klicken ein wenig herum und lesen die Umsätze manuell – wenn wir das können dann kann das auch der Computer. Die Idee für einen kleinen&nbsp;<a rel="noreferrer noopener" href="http://de.wikipedia.org/wiki/Webcrawler" target="_blank">Webcrawler</a>&nbsp;ist geboren.</p>



<h2 class="wp-block-heading">Welches Framework und warum?</h2>



<p class="wp-block-paragraph">Die ersten Versuche zum Abruf der Umsätze wurde auf Basis mit dem&nbsp;<a href="http://www.seleniumhq.org/" target="_blank" rel="noreferrer noopener">Selenium Testframework</a>&nbsp;durchgeführt. Dies hat den Vorteil dass die Benutzeraktionen direkt im Browser (über Firefox) aufgezeichnet und anschliessend in eine Java-Klasse exportiert werden können. Somit haben wir schnell eine erste Testklasse mit welcher wir das Konzept des Webcrawlers testen können. Der Nachteil ist, dass während der Ausführung des Codes ein eigener Browser gestartet wird. Zwar kann der Start des Browsers über die zusätzliche Installation eines Testservers (siehe Webseite von Selenium) umgangen werden, dennoch erscheint mir diese Lösung als etwas zu übertrieben für eine solch kleine Lösung.</p>



<p class="wp-block-paragraph">Also erinnerte ich mich an ein Gespräch mit einem Kollegen welcher mir von einer&nbsp;<a href="http://jsoup.org/" target="_blank" rel="noreferrer noopener">Java-Library namens „Jsoup“</a>&nbsp;erzählte. Diese Library ermöglicht es dem Benutzers Webseiten direkt aus dem Code zu lesen und unterstützt neben dem einfachen HTML auch Features wie CSS oder JQuery. Nachdem die ersten Tests mit Jsoup erfolgreich und die Laufzeit deutlich besser als die vorherige war, wurde die Entscheidung zum Einsatz von JSoup getroffen.</p>



<h2 class="wp-block-heading">Los geht´s</h2>



<p class="wp-block-paragraph">Bitte haben Sie Verständnis dafür, dass ich in meinem Beispiel keinen Code veröffentliche welcher direkt ausführbar und funktional zum Zugriff auf eine Bank ist. Vielmehr soll diese Seite einen technischen groben Überblick darüber geben, wie einfach es ist eine Webseite zu lesen und deren Inhalte auszuwerten. Wer diese Punkte nachvollziehen kann ist mit Sicherheit in der Lage die notwendigen Schritte selbst zu implementieren und in die eigene Softwarelösung einzubinden.</p>



<p class="wp-block-paragraph">Die hier gewählte Implementierung setzt den Focus auf Lesbarkeit. Jsoup ermöglicht auch den verschachtelten Aufruf mit der direkten Angabe aller Page- / Form-Parameter in nur einer einzigen Zeile. Mir persönlich ist das zu unlesbar und für spätere Wartungen / Fehlersuchen zu kompliziert. Aus diesem Grund besteht mein Code aus einigen Codezeilen mehr als in anderen Beispielen zu finden.</p>



<p class="wp-block-paragraph">Bitte beachten Sie dass der Beispielcode in keinem Fall so eingesetzt werden sollte sondern nur das Vorgehen demonstrieren soll. Speziell das Thema des Exception-Handlings und eventuelle Null-Checks sollten zwingend auf die eigenen Bedürfnisse angepasst und überdacht werden.</p>



<h2 class="wp-block-heading">erster Aufruf und Login</h2>



<p class="wp-block-paragraph">Der erste Request in meinem Beispiel dient dazu, eine Webseite vom Code aus aufzurufen und diese mittels GET (also dem Befehl welcher der Browser beim Besuch verwendet) zu lesen. Hierbei gehe ich davon aus, dass die Zielseite eine Form mit dem Namen „login-form“ beinhaltet. Innerhalb dieser Form werden 2 Elemente mit dem Namen „username“ und „password“ erwartet:</p>



<pre class="wp-block-preformatted">	
	public Response getLoggedInSession(String url, String username,
			String password) {
		try {
			Document doc = Jsoup.connect(url).get();

			FormElement loginForm = (FormElement) doc.select(
					"[name=login-form]").first();
			loginForm.getElementById("username").attr("value", username);
			loginForm.getElementById("password").attr("value", password);

			Response response = loginForm.submit().execute();

			return response;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}</pre>



<p class="wp-block-paragraph">Diese Funktion führt die folgenden Schritte durch:</p>



<ul class="wp-block-list"><li>HTTP-GET auf die übergebene URL</li><li>Befüllung des Feldes „username“ mit dem übergebenen Username</li><li>Befüllung des Feldes „password“ mit dem übergebenen Passwort</li><li>Submit der Form über Submit</li><li>Rückgabe der Page welche nach dem Loginversuch vom Server zurückgegeben wurde</li></ul>



<h2 class="wp-block-heading">Anklicken eines Links innerhalb der eingeloggten Session</h2>



<p class="wp-block-paragraph">Im ersten Schritt wurde bereits eine Internetseite aufgerufen und ein auf der Seite befindliches Formular mit 2 Felder ausgefüllt. Dieses Formular wurde mittels dem HTTP-POST an den Server übertragen und das Ergebnis dieses Posts zurück gegeben.</p>



<p class="wp-block-paragraph">Gehen wir nun also davon aus dass der Login erfolgreich war und wir uns nun auf der gleichen Seite befinden, wie wenn wir uns selbst über den Browser auf der gewünschten Seite einloggen. Als nächstes klicken wir im Menübaum einen bestimmten Link an um z.B. in die Umsatzliste unseres Kontos zu gelangen. Wichtig hierbei ist, dass wir dem System irgendwie mitteilen, dass wir uns bereits in einer authentifizierten Session befinden. Hierzu übergeben wir einfach die aktuelle Session-ID beim Aufruf des gewünschten Links und rufen die Page über den HTTP-GET auf:</p>



<pre class="wp-block-preformatted">	public Document getUmsatzDocument(Response loggedInResponse,
			String umsatzDocumentUrl) {
		try {

			String sessionId = loggedInResponse.cookies().get("JSESSIONID");

			Document umsatzDoc = Jsoup.connect(umsatzDocumentUrl)
					.cookie("JSESSIONID", sessionId).get();

			return umsatzDoc;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
</pre>



<h2 class="wp-block-heading">Interpretation der Ergebnisse</h2>



<p class="wp-block-paragraph">Wenn alles gut gelaufen ist haben wir nun das Dokument in der Hand, welches die uns bekannte Seite mit den Kontoumsätzen beinhaltet. Diese Seite muss nun interpretiert werden, ich gehe im Beispiel davon aus, dass die Seite folgende Inhalte enthält:</p>



<ul class="wp-block-list"><li>ein DIV-Element mit der ID transactionList</li><li>Dieses DIV enthält eine Liste von weiteres DIV mit der ID transaction
<ul><li>jedes DIV mit der ID transaction enthält einen einzelnen Umsatz</li><li>in jedem DIV existieren DIVs mit den eigentlichen Inhalten
<ul><li>ID date = Datum</li><li>ID amount = Betrag</li><li>ID topic = Verwendungszweck</li></ul>
</li></ul>
</li></ul>



<p class="wp-block-paragraph">Eine solche Beispielseite könnte wie folgt gelesen und interpretiert werden:</p>



<pre class="wp-block-preformatted">	private void readUmsaetze(Document umsatzDoc) {
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Element umsatzDiv = umsatzDoc.select("[id=transactionList]")
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.first();
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Elements umsaetze = umsatzDiv.select("[id=transaction]");

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (Element umsatz : umsaetze) {
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String datum = umsatz.getElementById("date").text();
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String betrag = umsatz.getElementById("amount").text();
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String verwendungszweck = umsatz.getElementById("topic").text();

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// behandle Umsatz wie gewünscht
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception e) {
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}
&nbsp;&nbsp; &nbsp;}</pre>



<h2 class="wp-block-heading">Was nun? Wie sieht der Praxiseinsatz aus?</h2>



<p class="wp-block-paragraph">Wie am obigen Beispiel zu sehen ist es mit nur wenigen Codezeilen möglich einen Login auf einer Seite durchzuführen, interne Seiten anzusurfen und deren Inhalte zu lesen und zu interpretieren. Im Grunde ist dieses Vorgehen für sämtliche Browserbasierten Anwendungen adaptierbar und kann in beliebiger Art und Weise eingesetzt werden.</p>



<p class="wp-block-paragraph">Problematisch bei dem Ansatz eines Webcrawlers ist allerdings die Tatsache, dass wir in unserem Code auf eine gewisse Beständigkeit des Layouts der zu lesenden Internetpräsenz angewiesen sind. Ständige Veränderungen der Internetseite auf der anderen Seite führen dazu, dass unsere eigene Software mehr oder weniger stabil ist und ständigen Anpassungen unterliegt.</p>



<p class="wp-block-paragraph">Bei mir persönlich hat sich dieses Vorgehen im Praxiseinsatz sowohl bei mir als auch bei einigen meiner Kunden inzwischen bewährt. Allerdings ist mein Praxiscode hierbei natürlich deutlich stabiler als der hier beispielhaft veröffentlichte und geht auf Themen wie die Fehlerbehandlung, Vermeidung von Doppelmeldungen oder Erkennung von Änderungen in der zugrunde liegenden Seitenstruktur ein.</p>



<p class="wp-block-paragraph">Jeder sollte für sich selbst herausfinden ob der Einsatz eines eigenen Webcrawlers eine Lösung für die vorliegende Problematik sein kann oder ob eine andere Alternativ gesucht werden muss. Allerdings ist dieses Vorgehen ein gutes Beispiel dafür, dass nicht immer der Aussage „geht nicht“ zu vertrauen ist – mit ein wenig nachdenken geht, sofern man bereit ist andere Wege zu bestreiten, so einiges …</p>
<p>Der Beitrag <a href="https://www.schiffler.eu/zahlungseingaenge-automatisiert-pruefen-auch-ohne-hbci/">Zahlungseingänge automatisiert prüfen – auch ohne HBCI</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.schiffler.eu/zahlungseingaenge-automatisiert-pruefen-auch-ohne-hbci/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 43/65 objects using APC
Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Minified using APC
Database Caching 13/30 queries in 0.003 seconds using APC

Served from: www.schiffler.eu @ 2026-08-24 00:47:26 by W3 Total Cache
-->