Authentication Abfrage trotz Authenticator

Ok, ich bin jetzt soweit, dass mein Servlet das Bild liest und auch ausgibt (getestet mit System.out und sieht sehr nach Bild aus ;) )
Jetzt ist meine Frage wie ich das Bild auf einer HTML/JSP Seite darstellen kann.
Mein erster Versuch:

<img src="/Servlet" />

hat natürlich nicht das gewünschte Ergebnis geliefert.
Welche Klasse/Methode muss ich nutzen, um das Bild auszugeben und in die HTML einzubauen?

Vielen Dank!
 
Jetzt ist meine Frage wie ich das Bild auf einer HTML/JSP Seite darstellen kann.
Mein erster Versuch:

<img src="/Servlet" />

hat natürlich nicht das gewünschte Ergebnis geliefert.
Welche Klasse/Methode muss ich nutzen, um das Bild auszugeben und in die HTML einzubauen?
Du mußt dem Browser den richtigen Content-Type Header übermitteln und dann das Bild als Antwort übergeben:
Java:
// ungefähr:

response.setContentType("image/png"); // den MIME Typ am besten vom Zielserver abfragen
response.getOutputStream().write(imgData); // gelesene Daten übergeben
\edit: es gibt auch mehrere Proxy Servlets. Du könntest dir ja mal deren Code anschauen, z.B. http://wp.edwardstx.net/wp-content/uploads/wp.edwardstx.net/2011/06/ProxyServlet.java_.txt

Gruß
 
Zuletzt bearbeitet:
Das klappt soweit, vielen Dank!

Sollte ich nun die Webseite, auf der das Bild erscheinen soll, vom Servlet generieren lassen, oder findet der Aufruf des Servlets (zum Aufruf des Bildes) in einer neuen JSP statt?
 
Zuletzt bearbeitet:
Eine Fehlermeldung erscheint nicht. Das Bild wird lediglich nicht angezeigt (rotes Kreuz)
Hier beide Codes:

Code:
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:
<body>

<img src="/servlets/Connect" width="320" height="222">

</body>
 
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ß
 
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? ;)
 
Zuletzt bearbeitet:
Den Scanner habe ich mir ergoogelt. Nach meinem Verständnis scannt er den InputStream und gibt das gescannte an getWrtier()?
Aber wozu willst du da irgendwas scannen? Du mußt doch einfach nur Lesen und Schreiben:
Java:
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[8000];
int nr;
while ((nr = si.read(buffer)) != -1) {
  out.write(buffer, 0, nr);
}
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...
Auch bei einem HTTP GET können Parameter übergeben werden.

Du solltest allerdings vielmehr die Daten in einer Session speichern. Siehe z.B. http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Session-Tracking.html

Gruß
 
Zurück