1

httpClient を使用してログイン検証を行い、サーバー側で無限ループを取得しようとしています。詳細はコードの後で説明します。これが私のサーバー側のコードです

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
    while(true){    
        String user_name = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("User name and password is "+user_name +"   paswword is "+password);
        resp.setContentType("text/plain");
        PrintWriter writer = resp.getWriter();
        if(user_name.equalsIgnoreCase("haseeb")){
            System.out.println("valid user name");
            writer.write("welcome");
            //writer.flush();
            break;
        }
        else{
            writer.write("unknown User");
            System.out.println("unknown user name");
            writer.flush();
            continue;
        }

    }//End of while loop

}   //End of doPost Method

クライアント側からログインしようとしています。ログインが無効な場合、サーバーは「unknownUser」を返します。ログインが有効な場合、クライアントは再度ログイン要求を送信し、ループが壊れます。サーバー側で私は無限ループを取得しており、サーバーは最初のリクエストパラメーターを何度も何度も処理しています....!!! さらなる支援のためにクライアント側のコードを投稿したい場合は、コメントセクションでそれを求めることができます..ありがとう

4

4 に答える 4

1

問題はブロックcontinue内にあります。elseそれもあったはずbreakです。ただし、これを記述するより良い方法は、whileループを使用しないことです。例えば

public void doPost(HttpServletRequest req, HttpServletResponse resp)
    String user_name = req.getParameter("username");
    String password = req.getParameter("password");
    System.out.println("User name and password is "+user_name +"   paswword is "+password);
    resp.setContentType("text/plain");
    PrintWriter writer = resp.getWriter();
    if(user_name.equalsIgnoreCase("haseeb")){
        System.out.println("valid user name");
        writer.write("welcome");
        writer.flush();
    }
    else{
        writer.write("unknown User");
        System.out.println("unknown user name");
        writer.flush();
    }

}   //End of doPost Method
于 2012-10-03T11:12:25.367 に答える
0

もちろん、無限ループが発生します。

while(true){ 
.....
    else{
        ......
        continue;
    }
}

それが原因です。

代わりにcontinue;、資格情報を要求するユーザーにリクエストを送り返す必要があります。

于 2012-10-03T11:15:35.230 に答える
0
while(true){

  if(...)
   break;

これは厄介なコードです..詳細が間違っている場合は例外をスローし、資格情報を再度書き込む必要があることをユーザーに伝えることができます。そして、新しい httpRequest を送信します。

于 2012-10-03T11:07:22.560 に答える
0

HTTP リクエストの仕組みを理解していないようです。

ユーザーのブラウザは、ログイン ページを要求するリクエストをサーバーに送信します。サーバーは HTML で応答し、その応答はそこで終了します。次に、ユーザーは自分の資格情報を検証し、ブラウザーが新しい要求を送信するようにします。サーバーは、ログイン後のページ、またはログイン ページの再表示と、資格情報が一致しなかったことを示すメッセージで応答しますが、どちらの場合も、応答はそこで再び終了します。HTTP 接続は保持されません。これは、一連の要求と応答が別々の接続で行われるだけです。

したがって、ループは使用せず、要求ごとに 1 回、適切な HTML を送り返すだけです。


これは、ユーザーのアプリケーションがブラウザではなくデスクトップ アプリケーションであっても、トランスポートとして HTTP を使用している限り当てはまります。少なくともHttpServletRequest/HttpServletResponseパラダイムを使用している場合は、同じリクエストを使用してデータを再送信することはできません。

于 2012-10-03T11:21:28.210 に答える