Java Servlet 无法获取 POST 参数

4
我正在尝试创建一个简单的登录界面,其中包含一个电子邮件字段、一个密码字段和一个登录按钮(全部包含在一个<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数据的文章(特别是这篇这篇),但似乎都没有帮助到我。两者都建议使用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--

对于一个没有经验的人来说,这段代码看起来客户端已经正确发送了非空的email变量和非空的password变量,但我对此并不熟悉...

最后的结论

首先,我需要确定这是客户端还是服务器端的错误。这个问题是为了诊断它是否为服务器端的错误或者排除这种可能性。那么,有没有经历过Servlet的老手发现HTTP请求或处理它的Servlet代码有什么问题?如果这是服务器端的错误,我需要改变什么才能访问我的表单变量?


1
服务器代码看起来没问题。你能展示一下客户端代码吗?你可以尝试将表单作为普通POST提交,而不是使用Ajax,以检查服务器代码是否正常。 - vanje
感谢 @kuporific (+1) - 我不反对展示客户端代码,但请考虑一下:如果我没有命名输入,那么HTTP POST如何显示一个名为email和另一个名为password的变量呢?!? - IAmYourFaja
谢谢@vanje (+1) - 请看一下我在palayan的回答下面的评论 - 我有同样的问题要问你! - IAmYourFaja
1个回答

1
当您通过ajax提交表单时,您是否以JSON格式发送数据? 如果是,则应该明确从userId和password框中提取数据,并以JSON格式将其发送到服务器。这将解决问题。

感谢@palayan (+1) - ,我没有将表单数据提交为JSON,这很可能会解决问题,所以谢谢!然而,这让我感到好奇,为什么它可以解决问题。是因为服务器将请求主体作为一个大文本块获取,我需要使用request.getReader()手动解析该文本块的键值对吗?这就是为什么将数据格式化为JSON会帮助服务器解析请求主体的原因吗?再次感谢! - IAmYourFaja
1
是的,看起来我的怀疑是正确的。看起来你需要使用request.getReader()逐行读取请求体的内容(感谢J2EE),然后想出自己的范例来解析键值对...或者像@palayan建议的那样,我可以强制客户端发送包含电子邮件和密码的自定义JSON对象,然后在服务器上使用GSON或FlexJSON将JSON对象反序列化为POJO。所以这就是我要做的! - IAmYourFaja
如果在应用程序的某个点上没有发送数据的JSON格式的限制,那么JSON类型的数据格式将更容易使用。 - palayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接