2011-12-21 8 views
1

私はHTMLとJSPを使用してログインページを構築しています。しかし、私は、ユーザー名がテーブルと一致しないときに表示されるはずのエラー "username incorrect"がSQL Serverであるたびに取得します。ここでは、ログインフォームページのコードは次のとおりです。JSPを使用したユーザー検証

以下
<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Expense System</title> 
<link rel="stylesheet" href="style.css" type="text/css"> 
</head> 

<body> 

<div class=form> 

<form name = login method = post action = "login1.jsp"> 
Username : <input name = user type = text placeholder = username> <br><br> 
Password : <input name = pass type = password placeholder = password><br><br> 

<input type = submit value = "Submit"> 
<input type = button value = "Register"> 

</form> 
</div> 
</body> 
</html> 

はlogin1.jspのコードです:

<%@ page language="java" contentType="text/html; charse=UTF-8" 
pageEncoding="UTF-8" import="java.sql.*"%> 

<% Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); %> 

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>login check</title> 
</head> 
<body> 

<% String connectionUrl = "jdbc:sqlserver://localhost:1433;" + 
     "databaseName=signin;integratedSecurity=true;"; 
    Connection con = DriverManager.getConnection(connectionUrl); 
    String uname = new String(""); 
    String upass = new String(""); 
    ResultSet resultset; 
    Statement statement = con.createStatement(); 
    statement.executeQuery("select username, password from signintable"); 

    resultset = statement.getResultSet(); 

    while(resultset.next()){ 
     uname = resultset.getString("username"); 
     upass = resultset.getString("password"); 
    } 

if(!request.getParameter("user").equals("")){ 
if(uname.equals(request.getParameter("user"))){ 
if(upass.equals(request.getParameter("pass"))) {%> 
<jsp:forward page="welcome.html"></jsp:forward> 

<% } 
else { 
    out.println("pass incorrect"); 
} 
} 
else { 
    out.println("username incorrect"); 
} 
} 
else { out.println("user not found!"); 
} 
%> 

</body> 
</html> 
+0

誰かがログインするたびに、テーブル全体を持ち帰り、アプリケーションでそれをループするのは良い考えではありません! 'WHERE'条件でパラメータ化されたクエリを調べて、存在する特定の行を選択し、パスワードをハッシュするだけであれば、それを調べるべきです。 –

+0

Javaで 'string uname = new String(" ");'や 'String upass = new String(" ");'のような文を使用するのは避けられます。悪い習慣。 'string uname =" "'と 'String upass =" "'を使うだけです。この場合、それらの文字列オブジェクトをプールしています。 – Lion

+0

@MartinSmith私はWHERE条件を使用しましたが、プログラムを正常に実行できました。しかし、私がやりたいことは、最初にユーザー名を確認し、それが正しい場合はパスワードを確認することです。どのようにWHERE条件を使用してこれを行うことができます。ありがとう。 –

答えて

2

あなたは、Javaのメモリに全体データベーステーブルを運搬しての値を代入していますすべての単一の行を同じ変数に置き換えます。これらの変数は、表の最後の行の値を保持してしまいます。

これは正しくありません。 正確にを選択する必要があります。あなたのSQLクエリは次のようにのようなものに変更します。

PreparedStatement statement = con.prepareStatement("select id from signintable where username=? and password=?"); 
statement.setString(1, request.getParameter("user")); 
statement.setString(2, request.getParameter("pass")); 
resultSet = statement.executeQuery(); 

if (resultset.next()) { 
    // Valid login! 
} else { 
    // Invalid login! 
} 

無関係具体的な問題に、JSPファイル内のJavaコードを書くことpoor practiceです。私はあなたにもそれに取り組むことをお勧めします。 servletsの使い方を学んでください。

+0

あなたの提案をありがとう。しかし、私は自分のコード内の問題について知りたいと思っています。何が問題なのか教えていただけますか? –

+0

これは第1段落で説明しました。 DBが1行以上を返すとします。 'while'ループの中で、個々の行からユーザ名/パスワードを取得し、ループの外で宣言された変数に代入しています。すべてのループ反復で、以前に割り当てられた値は**現在の行の値で**上書きされます**。ループの後、変数は* last *行の値を保持します。あなたは* last *行の値を比較しています。 – BalusC

+0

はい。私のところでは非常にばかげたミス。ありがとう。 –

-1

あなたが詳細表示をしたい場合は、あなたのコードで、ちょうどあなたが繰り返し"din't find it "フレーズの後"found the user name "があるだろうことを確認します

if(!request.getParameter("user").equals("")) { 
    if(uname.equals(request.getParameter("user"))) { 
     if(upass.equals(request.getParameter("pass"))) { 
      out.println("found the user name ") 
     } 
    } 
} else { 
    out.println("din't find it "); 
} 

を書きます。

関連する問題