【问题标题】:Synchronize Request and Response in HttpClient Class在 HttpClient 类中同步请求和响应
【发布时间】:2012-10-03 20:27:37
【问题描述】:

我正在尝试使用 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”,如果登录有效,则客户端将再次发送登录请求,循环将中断。在服务器端,我得到了无限循环,服务器一次又一次地处理第一个请求参数....!!!如果有人想要我可以发布我的客户端代码以获得进一步帮助,您可以在 cmets 部分索取。谢谢

【问题讨论】:

  • 要记住的一点是我的客户端是 java 桌面应用程序..不是浏览器

标签: java jsp servlets httpclient


【解决方案1】:

问题在于else 块中的continue。它也应该是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

【讨论】:

  • 兄弟如果用户再次尝试登录验证我必须再次检查它在这种情况下如何做到这一点?
  • 当用户再次尝试登录时,你的doPost方法会被再次调用
  • 感谢您的帮助,这很有意义,让我在没有循环的情况下再试一次,如果我以这种方式做对了,请回复评论......以便将来任何人都可以使用它......
【解决方案2】:

您似乎不了解 HTTP 请求的工作原理。

用户的浏览器向服务器发送一个请求,请求登录页面,服务器以 HTML 响应,响应到此结束。然后,用户验证他的凭据,导致浏览器发送 new 请求,并且服务器响应登录后的页面,或者再次登录页面和一条消息,表明凭据没有匹配,但在这两种情况下响应再次在那里结束。不保留 HTTP 连接,它只是单独连接中的一系列请求和响应。

因此您不使用循环,只需将适当的 HTML 发送回,每个请求一次。


即使用户的应用程序是桌面应用程序而不是浏览器,只要它使用 HTTP 作为其传输方式,这仍然成立。您不能使用相同的请求重新提交数据,至少在您使用 HttpServletRequest / HttpServletResponse 范式时不能。

【讨论】:

  • 好的,兄弟,非常感谢您的快速指南……我搞砸了,否则我得到了这些概念……
【解决方案3】:
while(true){

  if(...)
   break;

这是讨厌的代码.. 当细节错误时你可以抛出一个异常并告诉用户他需要再次编写他的凭据。然后发送一个新的 httpRequest。

【讨论】:

  • 兄弟,如果用户一次又一次地写入无效的用户名/密码..我必须在循环中检查它。
  • 你不必用一段时间来写这个(真的,你可以把你的检查放在你的 while 语句中......但这仍然是一个坏主意。
【解决方案4】:

当然你会得到一个无限循环!

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

这就是它的原因。

您应该将请求发送回请求其凭据的用户,而不是 continue;

【讨论】:

  • 我的客户端是一个桌面应用程序。如果我再次要求他输入凭据,我必须再次检查它。如果不在循环中,我将如何再次执行此操作?
  • 桌面应用是什么意思?基于摇摆?
  • Servlet 是否与摇摆应用有关?
  • 它们是如何集成的?他们之间的谈话如何?
  • 是的 servlet 会响应,基于这些响应我会做一些其他的动作。这就是需求的方式
猜你喜欢
  • 2016-07-18
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多