JSP+Oracle+JavaBeans (logowanie)

0

Witam wszystkich serdecznie, jestem początkującym użytkownikiem Javy, więc liczę na waszą wyrozumiałość (najpierw próbuję, zwyczajnie żeby mi Tomcat wyświetlił na ekran przeglądarki jakieś dane)
Mam do zrobienia projekt stronki JSP z logowaniem wykorzystując JavaBeans do połączenia z bazą danych Oracle.

Mam 2 koncepcje ale niestety coś w nich jest złego i nie wiem gdzie leży błąd, czy ktoś mógłby mi pomóc?

Oto jak wygląda sytuacja:
<font size="4">I koncepcja</span>
Stronka z logowaniem (index.jsp)

  <body>
        <h1>Witaj kliencie </h1>
        <form action="zalogowany.jsp" method="POST">
         LOGIN:<input type="text" name="login" value="" /><BR>     
         <input type="submit" value="ZALOGUJ" />
        </form>

    </body>

Tak u mnie wygląda kod java bean odpowiedzialny za zwrot hasła

package beany;

public class login {
private String login;

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }  
}

A tak stronka zalogowany.jsp

  <jsp:useBean id="logowanie" scope="session" class="beany.login" />
        <jsp:setProperty name="logowanie" property="login" value="" />
     <%
        Class.forName("oracle.jdbc.OracleDriver");
        Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "SYSTEM","bazy1234");
        Statement st=conn.createStatement();
        ResultSet rs=st.executeQuery("Select IMIE,NAZWISKO,ADRES, WIEK from KLIENCI where LOGIN ='"+logowanie.getLogin()+"'");
        ResultSetMetaData md;
        md=rs.getMetaData();

        while(rs.next())
           {
            String imie=rs.getString("IMIE");
            String nazwisko=rs.getString("NAZWISKO");
            String adres=rs.getString("ADRES");
            int wiek=rs.getInt("WIEK");
            out.println("IMIE   \tNAZWISKO    \tADRES   \t\t   \tWIEK"+"<br>");
            out.println(imie+"  \t"+nazwisko+"   \t"+adres+"   \t\t\t"   +wiek+"<BR>");
            }
   %> 

Co najdziwniejsze jeżeli wszystko skompiluję nie ma błędów, wpiszę poprawny login (który jest dostępny w bazie w tabeli Klienci) wyskakuje mi pusty ekran przeglądarki dla strony Zalogowany :(

Gdy zmienię kod i uruchamiam samą stronkę zalogowany.jsp i polecenie SQL wygląda tak:
ResultSet rs=st.executeQuery("Select IMIE,NAZWISKO,ADRES, WIEK from KLIENCI");

wyświetla wszystko elegancko

<font size="4"> II koncepcja jest ze stronki</span>

http://www.codetoad.com/java_jsp_id_verification.asp

Tylko tam w kodzie jest błąd dla słowa validate (wiem że gość podaje bazę danych MS Access)

<%@ page import="java.util.*" %>
<jsp:useBean id="idHandler" class="foo.Login" scope="request">
<jsp:setProperty name="idHandler" property="*"/>
</jsp:useBean>

<% 
   if (idHandler.validate()) {
%>
<jsp:forward page="success.jsp"/>
<%
   }  else {
%>
<jsp:forward page="retry.jsp"/>
<%
   }
%>

I wiadomo, succes logujemy się, retry odrzut ;)

Java Bean tego gościa odnośnie logowania

package foo;
 import java.sql.*;

 public class Login {

   private String username = "";
 private String password = "";

   public Login() {
  }

  public void setUsername(String username) {
     this.username = username;
  }

  public void setPassword(String password) {
     this.password = password;
   }


 public boolean  authenticate(String username2,
 String password2) {
  String query="select * from Registration;";
   String DbUserName="";
   String DbPassword="";
   String finalUser="";
  try {
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   Connection
 con=DriverManager.getConnection("jdbc:odbc:register");
   Statement stat=con.createStatement();
   ResultSet rst=stat.executeQuery(query);
   while(rst.next())

  {
   DbUserName=rst.getString("UserName");

  DbPassword=rst.getString("password");

   if (username2.equals(DbUserName) &&
 password2.equals(DbPassword)) {

 break;
     }


   }
 return true;
 }catch(Exception e){

 e.printStackTrace();
 return false;
 }
}}

Umiem przerobić to na Oracle'a ale nie wiem co należy wpisać w tym wyrazie "validate" żeby mi zwróciło wynik porównania.

POMOCY :( :-[ :/

0

Obie koncepcje sa na obecne czasy mocno naciagane. Ale powiedzmy, ze od czegos trzeba zaczac.

I koncepcja
Tworzysz zmienna sesyjna

<jsp:useBean id="logowanie" scope="session" class="beany.login" />
<jsp:setProperty name="logowanie" property="login" value="" />

Wszystko by bylo w porzadku, gdybys w drugiej linijce zamiast recznie ustawiac pusta wartosc value="", pozwolil zrobic to kontenerowi. Jesli usuniesz to przypisanie, Tomcat sam sobie pobierze wartosc z requesta i wywola odpowiedni setter z Twojego bean'a. Reszta powinna wtedy zadzialac.

Uwagi do tej koncepcji:
#1 stona JSP, sama w sobie, ma sluzyc do prezentacji. Logike biznesowa i model danych (dostep do bazy danych) powinno sie realizowac w osobnych "warstwach" (zapoznaj sie ze wzorcem: MVC). Caly mechanizm dostepu do bazy danych i przetwarzania odpowiedzi, w Twoim przypadku powinny np. zostac przeniesione do konkretnego serwletu odpowiedzialnego za logowanie.
#2 przekierowujesz uzytkownika na zalogowany.jsp mimo, ze jeszcze nie sprawdziles, czy w ogole taki uzytkownik istnieje. Powinienes to raczej zrobic na styl koncepcji II, gdzie istnieje strona (lub ew. serwlet), ktora decyduje, gdzie uzytkownik zostanie przekierowany.
#3 zapoznaj sie z SQL Injection i pomysl, jak poprawic Swoj kod.

II koncepcja
Autor zamiast validate() mial raczej na mysli metode authenticate(String username2, String password2), ktora zdefiniowal sobie w beanie foo.Login.

Ta koncepcja jest troche lepsza od poprzedniej, ale tez daleka od doskonalosci. Kod dostepu do danych powienien zostac oddelegowany do osobnej klasy, odpowiedzialnej za zarzadzanie polaczeniem z baza oraz zwracanie wynikow w jednolitej formie (w zaleznosci od zapytania).

0

Dziękuję za odpowiedź ;) [browar]

Postaram się zrobić obie wersje (ta 2 wiadomo lepsza, ale od czegoś trzeba zacząć)
To ma być tylko "zwykły" projekt a nie biznesowy ;) (czytaj zaawansowany)
Również dziękuję za uwagę o SQL Injection [browar] [browar]
Tylko troszkę to wnerwiające, bo netbeans sam dodaje value="" i potem jest nie halo :|

A co do 2 metody, nie wiem jak razem sklecić to żeby mi porównywało wartości wprowadzone z formularza wprowadzone do beana (login, hasło) (equalsami, ale chodzi mi o przeszukiwanie bazy w poszukiwaniu takiego użytkownika)z tymi w bazie (wiadomo, resultset i inne, ale powoli) - zrobi się ;)

Wiadomo, teraz pora na pobranie i sprawdzenie hasła, i jeżeli para user&login = true
select bla bla bla from klienci ;)

Nie zmienia to faktu, że niezmiernie dziękuję użytkownikowi ws (czyżby web service ;) ) że mi odpowiedział [browar]

0

Witam!
Jednak nie mogę sobie poradzić z pewną rzeczą mianowicie, nie widzi mi jednej klasy (nie ma w niej protected, private czy coś)
W javabeans mam tylko zwracanie pary login&hasło, do oddzielnego pliku javy skierowane jest zapytanie czy taka para login&hasło występuje w bazie danych i tutaj zaczynają się schody.

Kod programu do javabens wygląda następująco (generowany Netbeansem)

package beany;

public class konekt {

public String username,userpassword;

public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUserpassword() {
        return userpassword;
    }

    public void setUserpassword(String userpassword) {
        this.userpassword = userpassword;
    }
}

Pliczek JSP o nazwie index.jsp wygląda tak:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Stronka tytułowa</title>
    </head>
    <body>
        <h1>Witaj kliencie </h1>
         <center>
         <form action="zalogowany.jsp" method="POST">
         <p align="center">LOGIN:<input type="text" name="username" /><BR></p>
         <p align="center">HASŁO:<input type="password" name="userpassword"/><BR></p>
         <input type="submit" value="ZALOGUJ" />
         </form>
         </center>

    </body>
</html>

Problem pojawia się z plikiem javy, który sprawdza czy taki użytkownik istnieje.
Oto on:

package beany;
import beany.konekt.*;
import java.sql.*;
public class dane
{
public boolean sprawdz (String user, String upasswd)
//tutaj też dylemat czy sprawdz (), czy sprawdz(String user, String upasswd)
{
  
    try {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost","SYSTEM", "bazy1234");
        Statement st=conn.createStatement();
        ResultSet rs=st.executeQuery("SELECT LOGIN, HASLO FROM KLIENCI");
        while(rs.next())
        {
        String uzytkownik=rs.getString("LOGIN");
        String passwd=rs.getString("HASLO");
      <b>  if (uzytkownik.equals(konekt.this.username)&& (passwd.equals(konekt.this.userpassword)))</b>
//jeżeli wrzucę ("konekt.this.username") to nie ma błędu ale to ma mi porównać z obiektem, a w "" traktuje jako String :(
        {
        break;
        }
        }
         return true;
    } catch (Exception e)
         {
  
        e.printStackTrace();
        return false;
                        }
}

}

Nie wiem czemu ta klasa dane nie "widzi" klasy konekt. Klasa konekt jest zaimportowana, nie ma nigdzie słowa private lub protected.

Jestem już zupełnie zdezorientowany :( jak piszę to Netbeans mi pokazuje podpowiedzi k... (konekt) stawiam kropkę . a on się pyta o class i lipa nie widzi tych metod z pliku konekt.

Czyżby problem tkwił w (konekt.this.username)? Po wpisaniu tego w cudzysłowy
("konekt.this.username") nie wywala mi błędu ale coś nie czuję tego :/

========================================================

Jeszcze taka mała prośba

Jak potem na stronce zalogowany.jsp
odwołać się do tego sprawdzenia

<% if(dane.sprawdz()==true){
%>
<jsp:forward page="success.jsp"/>
<%
} else {
%>
<jsp:forward page="retry.jsp"/>
<%
}
%>

Powiedzcie mi jak można "zainicjalizować" inaczej metodę dane.sprwdz()
Chodzi mi czy można na stronce jsp wrzucić coś takiego (próbowałem ale coś nie za bardzo, za mało jeszcze wiem i umiem

if (konekt.sprawdz(bin.getUsername,bin.getUserpassword))

Załączam mój projekt z tego, jeżeli ktoś mógłby poświęcić nieco czasu i rzucić okiem wskazać mi błędy będę bardzo wdzięczny.
http://www.sendspace.com/file/mjbh8x

0

Nikt mi jednak nie pomógł ale udało się.

Jeżeli ktoś robi stronkę do logowania za pomocą JSP & servlets & javabean to może mu się przydać.

Dziękuję WS za wskazówki odnośnie odseparowania kodu odpowiedzialnego za sprawdzenie kombinacji user& hasło od stronki jsp.

plik logowanie.jsp

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form action="zalogowany.jsp" method="POST">
            <br><br>
            <table align="center"><tr><td><h2> Weryfikacja użytkowników</h2></td></tr></table>
            <table width="300px" align ="center" style="border:1px solid #000000;background-color: green;">
           <tr><td colspan=2></td></tr>
           <tr><td colspan=2><BR></td></tr>
           <tr><td><b>LOGIN:</b></td> <td><input type="text" name="username"/></td>
           <tr><td><B>HASŁO:</B></td><td><input type="password" name="userpass"/></td></tr>
           <tr><td> <input type="submit" value="Zaloguj" /></td><td><input type="reset" value="Wyczyść dane" /></td></tr>
            </table>
        </form>
    </body>
</html>

plik javabeans odpowiedzialny za pobranie username i userpass

package beany;

/**
 *
 * @author Krzysztof
 */
public class logujacy {
String username,userpass;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpass() {
        return userpass;
    }

    public void setUserpass(String userpass) {
        this.userpass = userpass;
    }
}

stronka figurant do której będą przesłane dane z formularza a następnie przechwycone przez servlet
zalogowany.jsp

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Logowanie do bazy danych</title>
    </head>
    <body>
<jsp:useBean id="sprawdz" scope="request" class="beany.logujacy" />
        <jsp:setProperty name="sprawdz" property="username" value="<%=request.getParameter("username") %>"/>
        <jsp:setProperty name="sprawdz" property="userpass" value="<%=request.getParameter("userpass") %>" />

        <jsp:forward page="witamy.jsp">
            <jsp:param name="nazwau" value="<%=sprawdz.getUsername()%>"/>
            <jsp:param name="haslou" value="<%=sprawdz.getUserpass()%>"/>
        </jsp:forward>
            
    </body>
</html>

servlet login który nawiązuje połączenie i sprawdza login i hasło
login.java

package beany;

import java.sql.*;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Krzysztof
 */
public class login extends HttpServlet {
   
 public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Statement st=null;
        ResultSet rs=null;
        String username="";
       String userpass="";
       String strQuery= "";
       HttpSession session = request.getSession(true);

        try
        {
        Class.forName("oracle.jdbc.OracleDriver").newInstance();
        Connection cnn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "SYSTEM","bazy1234");
        if(request.getParameter("username")!=null && request.getParameter("userpass")!=null && request.getParameter("username")!="" && request.getParameter("userpass")!="")
                {
                    username=request.getParameter("username").toString();
                    userpass=request.getParameter("userpass").toString();
                    strQuery="select * from KLIENCI where LOGIN='"+username+"' and HASLO ='"+userpass+"'";
                    System.out.println(strQuery);
                    st =cnn.createStatement();
                    rs = st.executeQuery(strQuery);
                    int count = 0;
                    while(rs.next())
                    {
                    session.setAttribute("username",rs.getString(2));
                    count++;
                    }
                        if(count>0)
                        {
                            response.sendRedirect("witamy.jsp");
                        }
                        else
                        {
                       response.sendRedirect("odmowa.jsp");

                        }
                    System.out.println("Podłączony do bazy Oracle");
                    cnn.close();
                    
                }
        }
        catch (Exception e)
        {
        e.printStackTrace();
        }
        }
    } 


Stronka powitalna gdy user & login == true
witamy.jsp

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <table align="center" style="border:1px solid #000000;">
            <%

            if(session.getAttribute("username")!=null && session.getAttribute("username")!="")
                {
                String uzytkownik = session.getAttribute("username").toString();
                  %>
              
                <tr><td align="center"><h1>Witamy<br>   <BR><b><%=uzytkownik%></b></h1></td></tr>
            <%
            }
            %>


        </table>
    </body>

Stronkę z odrzutem chyba sobie każdy sam wymyśli ;)

Pozdrawiam [soczek]

0

a mam pytanie:

jak zrobić tak, żeby w czasie logowania pojawiała się ta "strona figurant" z informacją, że trwa logowanie , a międzyczasie serwlet by sprawdzał czy hasło się zgadza? W sensie jak przechwycić to przez serwlet. Jak dałem sobie w web.xml <url-pattern>/zalogowany.jsp</url-pattern>, to od razu przenosiło mnie do serwleta.

Chodzi mi o coś takiego:

  1. Strona startowa, wpisanie danych
  2. Strona informująca , że trwa logowanie,
  3. W międzyczasie serwlet sprawdza czy hasło jest ok
  4. w zależności od podanych danych - albo strona powitalna, albo taka, gdzie jest info o złych wprowadzonych danych.
0

Logowanie trwa 1140 nanosekund :), u mnie sprawa wygląda tak że po wpisaniu do formularza danych i kliknięciu zaloguj to albo stronka witamy.jsp albo odmowa.jsp (jak jest zły login i/lub hasło).
Nie bawiłem się w coś takiego jak stronka pośrednia czy info że trwa logowanie.
Możliwość i chyba moim zdaniem słuszna - to spróbuj się pobawić w netbeansie również z servletem, gdzie w sessji wpiszesz mu
session.wait() i podajesz czas w nanosekundach - i dać jakąś dużą wartość i wkomponować do servletu kod html z out.println ("Trwa logowanie prosimy czekać") z jakimś tłem (ok 2-3 sekund mam nadzieję że starczy, a potem pozwól zadziałać servletowi (połączenie, sprawdzenie decyzja co zrobić)

Takie jest moje zdanie ale ja mam za małe doświadczenie w tym ;)
Czekam aż może ktoś inny się wypowie (WS? , Koziołek?)

0

więc po co Ci w ogóle:
zalogowany.jsp

nie lepiej od razu na serwlet wysłać te dane?

0
Chris85 napisał(a)

Logowanie trwa 1140 nanosekund :), u mnie sprawa wygląda tak że po wpisaniu do formularza danych i kliknięciu zaloguj to albo stronka witamy.jsp albo odmowa.jsp (jak jest zły login i/lub hasło).
Nie bawiłem się w coś takiego jak stronka pośrednia czy info że trwa logowanie.
Możliwość i chyba moim zdaniem słuszna - to spróbuj się pobawić w netbeansie również z servletem, gdzie w sessji wpiszesz mu
session.wait() i podajesz czas w nanosekundach - i dać jakąś dużą wartość i wkomponować do servletu kod html z out.println ("Trwa logowanie prosimy czekać") z jakimś tłem (ok 2-3 sekund mam nadzieję że starczy, a potem pozwól zadziałać servletowi (połączenie, sprawdzenie decyzja co zrobić)

Tak się nie da. Przeglądarka użytkownika musi od razu dostać całą odpowiedź.
Możesz jedynie wysłać żądanie logowania AJAXem i do chwili otrzymania odpowiedzi wyświetlić użytkownikowi animowanego gifa lub jakiś tekst.

1 użytkowników online, w tym zalogowanych: 0, gości: 1