-
04.08.11 14:37 #16
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Warum hat das nicht funktioniert? Fehlermeldungen?
Wie hast du es denn jetzt gemacht?
Bsp: http://www.servletsuite.com/servlets/imageview.htm
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Eine Fehlermeldung erscheint nicht. Das Bild wird lediglich nicht angezeigt (rotes Kreuz)
Hier beide Codes:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
package servlets; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URL; import java.util.Scanner; /** * Servlet implementation class Connect */ public class Connect extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Connect() { super(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final String ip = request.getParameter("ip"); final String user = request.getParameter("user"); final String pw = request.getParameter("pw"); final String interval = request.getParameter("interval"); InputStream is = null; Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, pw.toCharArray()); } } ); try { URL url = new URL("http://" + ip + "/CGI/Screenshot"); is = url.openStream(); response.setContentType("image/bmp"); response.getWriter().write(new Scanner(is).useDelimiter( "\\Z" ).next()); } catch (Exception e) { e.printStackTrace(); } finally { is.close(); } } }
Code :1 2 3 4 5
<body> <img src="/servlets/Connect" width="320" height="222"> </body>
-
04.08.11 15:07 #18
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Du hast lediglich die doPost Methode überschrieben.
Ein Bild in einem <img> Tag wird immer per GET geladen. Du mußt also die doGet Methode überschreiben.
\edit: Und was machst du da mit dem Scanner? Wozu soll das denn gut sein?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Den Scanner habe ich mir ergoogelt. Nach meinem Verständnis scannt er den InputStream und gibt das gescannte an getWrtier()? Einfach den InputStream kann ich ja nicht in den getWriter() packen. Wie sollte ich es machen?
Mir ist aber ein weiteres Problem aufgefallen. Seltsamerweise erst jetzt.
Wie bekomme ich denn nun die Zugangsadaten von der ersten HTML in das Servlet? Es gibt ja, wenn ich das Servlet im <img> der zweiten HTML ausgebe, keinen Request mehr fürs Servlet, aus dem ich die Parameter über request.getParameter() abgreifen kann...
Edit: Also über Hidden Inputs bekomme ich die Parameter zwar in die zweite HTML (bzw. JSP), doch wie krieg ich die dann ins Servlet?
Geändert von eiz (05.08.11 um 09:00 Uhr)
-
05.08.11 09:39 #20
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Aber wozu willst du da irgendwas scannen? Du mußt doch einfach nur Lesen und Schreiben:
Auch bei einem HTTP GET können Parameter übergeben werden.Code java:1 2 3 4 5 6
OutputStream out = response.getOutputStream(); byte[] buffer = new byte[8000]; int nr; while ((nr = si.read(buffer)) != -1) { out.write(buffer, 0, nr); }
Du solltest allerdings vielmehr die Daten in einer Session speichern. Siehe z.B. http://www.apl.jhu.edu/~hall/java/Se...-Tracking.html
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Dann muss ich mich aber auch ums destroyen der Session kümmern und das ist doch beim "sorglosen" Schließen des Browsers nur über ein Timeout möglich, oder?
-
05.08.11 10:37 #22
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Guten Morgen und danke erstmal.
Ich habe nun mal alles auf Session umgeschrieben, stehe allerdings schon vor dem nächsten Problem: Wann in die Session schreiben?
Ich habe dann, da ja das Bild per get aufgerufen wird, die Zugangsdaten im gleichen Servlet per Post in die Session geschrieben. Nun die Frage ob es so überhaupt sinnvoll ist, oder ob ich ein zweites Servlet schrieben soll?!
Außerdem kommt beim Aktualisieren der Screenshotseite die Meldung "Die bereits gesendeten Informationen, müssen erneut gesendet werden, um die Webseitewieder anzuzeigen.". Wie kann ich die Meldung umgehen?
Im nächsten Schritt muss ich noch evtl. Fehlermeldungen abfangen. Sollte z.B. der Login nicht funktionieren, wird eine XML Fehlerdatei mit Fehlercode im Browser angezeigt. Wie kann ich diese verarbeiten?
Über den InpustStream? Kann ich den irgendwie auslesen und dann verzweigen, ob es sich um eine Fehlermeldung oder um das Bild handelt?Geändert von eiz (08.08.11 um 08:14 Uhr)
-
08.08.11 08:26 #24
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Normalerweise erzeugt man eine Session bei einem erfolgreichen Login.
Von der Login-Seite würde man dann an eine andere "normale" Seite weiterleiten.
Du hast offenbar eine Seite mit einem Formular welches du per POST absendest und daraufhin gleich die Seite anzeigst. Deshalb fragt der Browser beim Aktualisieren ob du die POST Daten nochmal senden willst. Das löst du mit der Weiterleitung.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Es sieht so aus: Hinter dem "Login" verbirgt sich nur das Bild. Daher kann ich doch nur über Abrufen des Bildes testen ob die eingegebenen Daten stimmen?
1. HTML 1 mit Eingabemaske für Zugangsdaten
2. ---> Servlet 1 schreibt im doPost Daten in die Session und Weiterleitung an HTML 2
3. HTML 2 mit Ausgabe des Bildes
4. ---> Servlet 1 gibt das Bild im doGet aus und testet somit auch hier erst ob die Daten stimmen.
Ich wüsste nicht wie ich es anders lösen soll.
-
08.08.11 09:12 #26
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
2. ---> Servlet 1 testet im doPost ob die Zugangsdaten korrekt sind und schreibt ggf. Daten in die Session und Weiterleitung an HTML 2
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ok, das verstehe ich zwar, allerdings wird im Moment seltsamerweise keine Fehlermeldung ausgegeben, wenn die Zugangsdaten falsch sind...
Und auch der Authenticator macht mir nun Probleme. Er wird beibehalten, obwohl neue Zugangsdaten eingegeben werden. Das scheint jedoch bekannt zu sein: Stack Overflow
Hier nochmal der Quellcode...
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
package servlets; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URL; /** * Servlet implementation class Connect */ public class Connect extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Connect() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final String host = request.getSession().getAttribute("host").toString(); final String user = request.getSession().getAttribute("user").toString(); final String pw = request.getSession().getAttribute("pw").toString(); InputStream in = null; OutputStream out = null; Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, pw.toCharArray()); } } ); try { URL url = new URL("http://" + host + "/CGI/Screenshot"); in = url.openStream(); response.setContentType("image/bmp"); out = response.getOutputStream(); byte[] buffer = new byte[8000]; int nr; while ((nr = in.read(buffer)) != -1) { out.write(buffer, 0, nr); } } catch (Exception e) { e.printStackTrace(); } finally { in.close(); out.close(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("sessionID", session.getId()); session.setAttribute("host", request.getParameter("host")); session.setAttribute("user", request.getParameter("user")); session.setAttribute("pw", request.getParameter("pw")); session.setAttribute("interval", request.getParameter("interval")); ServletContext myServletContext = getServletContext(); RequestDispatcher rd = myServletContext.getRequestDispatcher("/screenshot.html"); rd.forward(request, response); } }
-
Sry für den Doppelpost, aber ich habe nun ein anderes Problem.
Das Problem mit dem Authenticator habe ich denke ich gelöst, jez bleibt für mich die Frage, wie ich herausbekomme, ob die Zugangsdaten stimmen:
Ich habe ein "ValidateLogin" Servlet, welches eigentlich nur testen soll, ob die eingegebenen Daten stimmen:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
package servlets; import java.io.IOException; import java.io.InputStream; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URL; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import sun.net.[url]www.protocol.http.AuthCacheValue;[/url] import sun.net.[url]www.protocol.http.AuthCacheImpl;[/url] /** * Servlet implementation class ValidateLogin */ public class ValidateLogin extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ValidateLogin() { super(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); InputStream in = null; final String host = request.getParameter("host"); final String user = request.getParameter("user"); final String pw = request.getParameter("pw"); try { AuthCacheValue.setAuthCache(new AuthCacheImpl()); Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, pw.toCharArray()); } } ); URL url = new URL("http://" + host + "/CGI/Screenshot"); in = url.openStream(); session.setAttribute("sessionID", session.getId()); session.setAttribute("host", host); session.setAttribute("user", user); session.setAttribute("pw", pw); session.setAttribute("interval", request.getParameter("interval")); ServletContext myServletContext = getServletContext(); RequestDispatcher rd = myServletContext.getRequestDispatcher("/redirect.html"); rd.forward(request, response); } catch (Exception e) { e.printStackTrace(); } finally { in.close(); } } }
Sollten nun falsche Zugangsdaten eingegeben werden, wird die URL Connection trotzdem hergestellt und es erscheint auch keine Fehlermeldung. Erst der Inhalt auf der nächsten Seite wird nicht dargestellt.
Möchte man sich unabhängig von meinem Programm anmelden, würde bei falscher Eingabe im HTTP Basic Auth eine XML Fehlermeldung angezeigt.
Wie kann ich das nun abprüfen?
Ähnliche Themen
-
java.lang.NoClassDefFoundError: javax/mail/Authenticator
Von Zanderfilet im Forum JavaAntworten: 5Letzter Beitrag: 11.03.09, 13:32 -
IE-Cache Bug: Trotz Meta-Tags, trotz dem 'tollen' Tipp von Microsoft
Von J1M1 im Forum HTML & XHTMLAntworten: 1Letzter Beitrag: 27.03.08, 01:04 -
Ausblenden von Spalten in einer SELECT-Abfrage trotz "SELECT *"
Von Greq im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 19.11.07, 23:29 -
Basic Authenticator überladen? Oder Einsatz von JAAS?
Von Topsen im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 5Letzter Beitrag: 28.01.06, 17:29 -
Trotz Abfrage dennoch Eintrag in DB
Von joky_joky im Forum PHPAntworten: 2Letzter Beitrag: 26.08.04, 12:18



2Danke


Zitieren
Login





