【问题标题】:Java servlet can't get POST params [duplicate]Java servlet 无法获取 POST 参数 [重复]
【发布时间】: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


【解决方案1】:

当您通过 ajax 提交表单时,您是否以 JSON 格式发送数据? 如果是这样,您应该从 userId 和密码框中显式获取 jquery 或 js 文件中的数据,然后以 JSON 格式将其发送到服务器。这样就可以解决问题了。

【讨论】:

  • 感谢@palayan (+1) - 不,我不将表单数据作为 JSON 提交,这可以很好地解决问题,所以谢谢!然而,它让我对 为什么 它可能会解决问题很感兴趣。是服务器将请求正文作为一大块文本获取,我需要使用request.getReader() 手动解析该文本块以获取键值对吗?这就是为什么以 JSON 格式格式化数据会帮助服务器解析请求正文的原因吗?再次感谢!
  • 是的,看来我的怀疑是正确的。看来您需要使用request.getReader() 来读取请求正文的内容,逐行(grrrr....感谢J2EE),然后提出自己的解析范式键值对...或者,就像@palyan 这里建议的那样,我可以强制客户端发送包含电子邮件和密码的自定义 JSON 对象,然后在服务器上使用 GSON 或 FlexJSON 将 JSON 对象反序列化为 POJO .所以这就是我要做的!
  • json 类型的数据格式会更容易使用,如果在您的应用程序的那个点以​​ json 格式发送数据没有任何限制。
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2013-10-22
  • 2019-02-28
  • 2011-08-29
  • 2012-11-13
  • 2014-06-06
相关资源
最近更新 更多