Authentication Abfrage trotz Authenticator

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?
 
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?
 
Zuletzt bearbeitet:
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ß
 
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.
 
2. ---> Servlet 1 testet im doPost ob die Zugangsdaten korrekt sind und schreibt ggf. Daten in die Session und Weiterleitung an HTML 2


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

Java:
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:

Java:
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.www.protocol.http.AuthCacheValue;
import sun.net.www.protocol.http.AuthCacheImpl;

/**
 * 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?
 
Zurück