- PR -

forward先にジャンプしない

1
投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-09-28 12:50
いつも御世話になります。
トップページでIDとパスワードでログインさせるjspで、IDが空白だったときの処理がうまくいかずに困っています。IDが空白だった場合はroguinerror.jspにジャンプして欲しいのですが、エラーになってしまいます。ソースは下記の通りです。

*********** index.html ********************

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>ようこそデータ管理ツールへ!</title>
</head>
<body bgcolor="#FFFFFF">
<h1>ログインIDとパスワードを入力してください</h1>
<form action='servlet/CheckLoginSession' method='post'>
<br>
<table border='0'>
<tr><td>ID:</td><td><input type='text' name='userid'></td></tr>
<tr><td>password:</td><td><input type='password' name='pass'></td></tr>
</table>
<input type='submit' name='login' value='ログイン'>
</form>

</body>
</html>

************** CheckLoginSession.java *****************

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

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 kamiBeans.DbSelEx;
import kamiBeans.SessionInfo;


public class CheckLoginSession extends HttpServlet {
String userId=null;
String pass=null;
String trueUserId=null;
String truePass=null;
String toUrl=null;
ResultSet rs=null;

protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

HttpSession thisSession=request.getSession(); //セッション取得
response.setContentType("text/html; charset=EUC-JP");//EUC-JP

userId= request.getParameter("userid");
pass=request.getParameter("pass");
try {
DbSelEx db=new DbSelEx();
String s="select * from syainmasta where syainid="+userId;
ResultSet rs= db.selDb(s);
if(rs.next()){
trueUserId=rs.getString("syainid");
truePass=rs.getString("keitai_tel");
}

if(userId.length()==0){
toUrl="/roginerror.html";
}else{

if(userId.equals(trueUserId) && pass.equals(truePass)){
SessionInfo se=new SessionInfo(userId,rs.getString("busyoid"),null,null,rs.getString("simei"));
request.setAttribute("sessionInfo",se);
toUrl="/jsp/welcome.jsp";
}else{
toUrl="/roginerror.html";
}
}

} catch (ClassNotFoundException e) {

e.printStackTrace();
} catch (SQLException e) {

e.printStackTrace();
}

getServletContext().getRequestDispatcher(toUrl).forward(request,response);
}
}

*************** roginerror.html ********************

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<head>
<title>ログインエラー</title>
</head>
<body bgcolor="#FFFFFF">
<h1>IDまたはパスワードに誤りがあります</h1>
<a href='../index.html'>ログインページに戻る</href>
</body>
</html>

*********** welcome.jsp ***********************

<%@ page language="java" pageEncoding="EUC-JP"
import="kamiBeans.*,java.sql.*" %><!--errorPage="/jsp/error.jsp"-->
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>業務内容選択</title>
</head>
<body bgcolor="#FFFFFF">
<%SessionInfo se=(SessionInfo)request.getAttribute("sessionInfo");%>
ようこそ、<%=se.getUserName()%>さん!<br>
表示させたい情報を選択して下さい。<br><br>
<%DbSelEx db=new DbSelEx();
ResultSet rs=null;
String s="select * from jspfileinfo";
rs=db.selDb(s);
request.setAttribute("sessionInfo",se);
while(rs.next()){%>

<a href='/web<%=rs.getString("tolink")%>'><%=rs.getString("title")%></a>

<%}%>
</body>
</html>

if文に問題があるのでしょうか??
ご教授のほどお願いいたします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-28 12:56
ユーザIDが空だと、SQL文の実行がエラーになりませんか?
それでcatchブロックに飛んでしまっているのではないかと思います。ユーザIDのチェックは
SQLの実行前におこなうべきでしょう。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-28 13:08
引用:

エラーになってしまいます。



エラーになってしまうのなら、どういうエラーが出るのか具体的に書きましょう。
#書きましょうというか、公開出来ない部分(ip等)以外に関してはコピペしていただくのが望ましいです

ざっと見た感じ、SQL文が不完全なためにSQLExceptionを発生して、Catchブロックに処理が飛んでしまい、nullにforwardしようとしてエラーかな……と思いますが。

コード:

userId= request.getParameter("userid");
pass=request.getParameter("pass");
try {



この、try句の直前(パラメータpass取得とtryの間)に

コード:

if(userId.length()==0){
toUrl="/roginerror.html";
}



を割り込ませてあげれば、一応、takeさんの提示なさっている「IDが空白だった場合」に関しては動くのではないかな、と思います。
でも、数字以外を与えると壊れそうだな等、不安材料は他にもあります。

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

って、toUrlとか、諸所の変数がインスタンス変数でね、コレ
不安材料とかいう次元ではなくて、これを稼動させるのはちょっと考え直した方がいいです。

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2004-09-28 13:12 ]
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-09-28 14:12
ご返答ありがとうございます。エラーも貼り付けた方がよかったですね。申し訳ないです。御二方の意見から、下記のようにしてみたら正常に動きました。

************ CheckLoginSession.java ****************

userId= request.getParameter("userid");
pass=request.getParameter("pass");
try {
DbSelEx db=new DbSelEx();


if(userId.length()==0){
toUrl="/roginerror.html";
}else{
String s="select * from syainmasta where syainid="+userId;
ResultSet rs= db.selDb(s);

if(rs.next()){
trueUserId=rs.getString("syainid");
truePass=rs.getString("keitai_tel");
}

if(userId.equals(trueUserId) && pass.equals(truePass)){
SessionInfo se=new SessionInfo(userId,rs.getString("busyoid"),null,null,rs.getString("simei"));
request.setAttribute("sessionInfo",se);
toUrl="/jsp/welcome.jsp";
}else{
toUrl="/roginerror.html";
}
}

} catch (ClassNotFoundException e) {

sqlエラーでした。データベースからの取り出しを文字数チェックの後ろにカットペーストしただけです。
ありがとうございました。

それと、永井さんのおっしゃる、

toUrlとか、諸所の変数がインスタンス変数でね、コレ
不安材料とかいう次元ではなくて、これを稼動させるのはちょっと考え直した方がいいです。

という意味が僕にはまだ理解できるレベルではなさそうです。お手数ですが初心者向けにやさしい言葉にしていただけるとありがたいのですが。。。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-09-28 14:18
このスレッドはご参考になるかと思います。(自分もこれで勉強しています)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15105&forum=12
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-09-28 17:08
taroさんありがとうございます。スレッド読みました。
一度読んだだけでまだ良く理解できていないのですが、

「インスタンス変数宣言をローカル変数宣言にする」

ことによって安定性やセキュリティが向上するという理解でも誤解じゃないですよね?
ということは、永井さんの

引用:

って、toUrlとか、諸所の変数がインスタンス変数でね、コレ
不安材料とかいう次元ではなくて、これを稼動させるのはちょっと考え直した方がいいです。




というご指摘も、ローカル変数にしてしまえば問題ないのでしょうか?

永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-28 18:09
引用:

「インスタンス変数宣言をローカル変数宣言にする」

ことによって安定性やセキュリティが向上するという理解でも誤解じゃないですよね?



というよりは「一般的に、Servletでインスタンス変数を使うと予期しない動作をすることがある(/多い)」……という感じではないかと思います。
クラス変数の場合は共有されることを意識していると思いますのでそれ自体でロジック的な問題が発生することは少ないと思うのですが、インスタンス変数に関しては勘違いでの使用が多いと思います。

引用:

というご指摘も、ローカル変数にしてしまえば問題ないのでしょうか?



そういうことになります。
ちょっと補足しておくと、ローカル変数とインスタンス変数に同名の変数名を定義することは、しばしば可読性の低下に繋がると思いますので、避けられた方がいいのではないかと思います。
#インスタンス変数とローカル変数の同名が一般的に認められている例外としてはSetter内での(引数としての)宣言くらいでしょうか。まあ、この辺の問題をつつくと、色々と燃え上がったりするので、ここでは深く突っ込みませんが

あと、蛇足ですが気になる点を適当に列挙しますと……

・外部システムとの接続部分(DAO)はクラスを切り分けたい
・trueUserIdとuserIdが異なることはロジック上あり得ない→比較している部分が無駄です
・可能であればPreparedStatementを使うようにすると便利です
・マジックワードが散在していて、変更・修正が大変そう
・遷移先を設定する部分がロジックに埋まっているため、ロジックが複雑化してくると遷移先を間違って上書きそう
・「rogin」は通常「login」と綴ると思います
・db接続の解放が不安

……くらいが目に付くところでしょうか。つまらないツッコミばかりで申し訳ないです
1

スキルアップ/キャリアアップ(JOB@IT)