【发布时间】:2014-01-12 17:41:57
【问题描述】:
我正在尝试创建一个简单的登录屏幕,其中包含一个电子邮件字段、一个密码字段和一个登录按钮(所有三个都包含在 <form/> 中)。当用户提交表单时,客户端执行一个 AJAX POST(异步以便用户不必“遭受”页面重新加载!)到 servlet。目前,servlet 只是进行虚拟检查,如果用户成功登录,则返回“1”,如果电子邮件/密码错误,则返回“0”。然后客户端处理响应(同样,将是 0 或 1)。
发生了什么:当我提交表单时,servlet 收到 HTTP POST 请求,但电子邮件/密码字段显示为 NULL:
public class SigninService extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
PrintWriter writer = null;
try {
writer = response.getWriter();
JSONSerializer serializer = new JSONSerializer();
System.out.println("\tFetching POST data...");
String email = request.getParameter("email");
System.out.println("\tEmail is " + email + "...");
String password = request.getParameter("password");
System.out.println("\tPassword is " + password + "...");
Integer answer = null;
// Dummy check; will replace with actual code once I get this example working...
if("testing@example.com".equals(email) && "12345".equals(password))
answer = 1;
else
answer = 0;
System.out.println("\tSerializing the HTTP response...");
String json = serializer.deepSerialize(answer);
System.out.println("\tSending response back to client...");
writer.write(json);
} catch (Throwable throwable) {
System.err.println(throwable.getMessage());
throwable.printStackTrace();
} finally {
writer.close();
}
}
}
上面的代码为电子邮件/密码打印null 值。我阅读了几篇关于从 HttpServletRequest 中提取 POST 数据的文章(特别是 this 文章以及 this 一篇),但似乎都没有帮助我。两者似乎都建议使用request.getReader() 方法,但这不是我需要的。我需要一种直接访问表单变量及其各自值的方法。
我无法判断我的客户端代码是否错误地格式化了 POST 请求并以 Java servlet 无法处理的方式发送表单数据,或者 Java servlet 是否没有正确编码以处理请求。
当我运行 Firebug 并提交表单时,这里是与请求关联的 Post 选项卡的内容:
-----------------------------18671963685702-some-really-long-number
Content-Disposition: form-data; name="email"
testing@example.com
-----------------------------18671963685702-another-really-long-number
Content-Disposition: form-data; name="password"
12345
-----------------------------18671963685702-and-another-really-long-number--
对于未经训练的人来说,这看起来就像客户端正确地发送了一个非 NULL email 变量,以及一个非 NULL password 变量,但同样,我在这里不熟悉的领域...
底线
我需要首先弄清楚这是客户端还是服务器端的错误。这个问题试图将其诊断为服务器端错误,或将其排除在外。那么,是否有任何厌倦了 servlet 的老手看到 HTTP 请求或处理它的 servlet 代码有什么问题?如果这是一个服务器错误,我需要更改哪些内容才能访问我的表单变量?
【问题讨论】:
-
服务器代码似乎没问题。你能显示客户端代码吗?您可以尝试在没有 Ajax 的情况下将表单作为普通 POST 提交,以检查您的服务器代码是否正常。
-
感谢@kuporific (+1) - 我不反对显示客户端代码,但请考虑一下:如果我没有命名输入,HTTP POST 如何显示名为的变量
email和另一个名为password?!? -
感谢@vanje (+1) - 请在 palaya 的回答下方查看我的评论 - 我有同样的问题要问你!
标签: java servlets http-post forms