tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
Like Tree2Danke
ERLEDIGT
NEIN
ANTWORTEN
27
ZUGRIFFE
730
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von eiz Beitrag anzeigen
    Und wie mache ich das :\
    Das Servlet im img Tag "aufzurufen" hat ja nicht funktioniert...
    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.

  2. #17
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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>
     

  3. #18
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  4. #19
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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)
     

  5. #20
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von eiz Beitrag anzeigen
    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:
    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);
    }
    Zitat Zitat von eiz Beitrag anzeigen
    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/Se...-Tracking.html

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #21
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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?
     

  7. #22
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von eiz Beitrag anzeigen
    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?
    Standardmäßig läuft eine Session nach 30 min. Inaktivität ab. Das kannst du z.B. mit setMaxInactiveInterval anpassen.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #23
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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)
     

  9. #24
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  10. #25
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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.
     

  11. #26
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  12. #27
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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);
        }
    }
     

  13. #28
    eiz eiz ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    15
    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

  1. Antworten: 5
    Letzter Beitrag: 11.03.09, 13:32
  2. Antworten: 1
    Letzter Beitrag: 27.03.08, 01:04
  3. Ausblenden von Spalten in einer SELECT-Abfrage trotz "SELECT *"
    Von Greq im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 19.11.07, 23:29
  4. Basic Authenticator überladen? Oder Einsatz von JAAS?
    Von Topsen im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 5
    Letzter Beitrag: 28.01.06, 17:29
  5. Trotz Abfrage dennoch Eintrag in DB
    Von joky_joky im Forum PHP
    Antworten: 2
    Letzter Beitrag: 26.08.04, 12:18

Stichworte